我正在编写一个程序,必须生成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;
}
答案 0 :(得分:3)
这部分毫无意义:
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 Shuffle对数组进行混洗。
答案 1 :(得分:0)
这种方法有偏见。除教育用途外,请勿使用它。
除了使用另一个数组的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