请帮忙。生成随机数的程序不起作用

时间:2011-06-23 21:56:10

标签: c

我正在编写一个程序,必须生成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;
}

2 个答案:

答案 0 :(得分:3)

  1. 这部分毫无意义:

    if(array[i]==0)
       array[i]=1;
    

    它会将你的选择限制在N-1个数字(1到N-1),你试图在不重复的情况下找到N个数字 - 导致无限循环。

  2. if((i-j)==1)
       continue;
    

    在这里你可能需要if (i==j)来检查前一个循环是否已经完成。

  3. 以随机顺序生成数字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