问题描述
|
我正在编写一个程序,该程序必须生成N个随机而不重复的数字
原型应该是voidrandom_int(int array [],int N);
它没有任何错误,但无法正常工作。连数字都没有
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void random_init(int array[],int N)
{
srand(time(NULL));
int i,j;
array[0]=rand()%N;
for(i=1;i<N;i++)
{
array[i]=rand()%N;
if(array[i]==0)
array[i]=1;
for(j=0;j<i;j++)
{
if(array[i]==array[j])
break;
}
if((i-j)==1)
continue;
else
i--;
}
}
int main(void)
{
int a[5],i,N;
N=5;
random_init(a,N);
for(i=0;i<N;i++)
printf(\"%d \",a[i]);
return 0;
}
解决方法
这部分没有任何意义:
if(array[i]==0)
array[i]=1;
它将您的选择限制为N-1个数字(1到N-1),从中您尝试不重复地找到N个数字-导致无限循环。
if((i-j)==1)
continue;
在这里,您可能需要if (i==j)
来检查先前的循环是否已完成。
以随机顺序生成数字0..N-1的更快,更简单的方法是将这些数字放入数组(按顺序排列),然后使用Fisher-Yates随机播放对数组进行随机播放。
, 这种方法是有偏见的。请勿将其用于教育目的。
除了使用另一个数组的Ficher-Yates之外,您可以使用遍历所有可用数字并为它们找到一个“随机”点的方法(有效地“初始化”两次数组)。如果地点被选中,请选择下一个。像这样的伪代码:
fill array with N
for all numbers from 0 to N-1
find a random spot
while spot is taken (value is N) consider next spot /* mind wrapping */
set value in current spot