在C中生成随机数而不重复

时间:2016-05-06 13:15:56

标签: c

以下结果可以生成随机数,但仍会出现重复的数字。猜猜 if else 语句中是否存在smtg错误?

附加:
问题是: 将条目生成为随机数,并重复创建新数字,直到找到合法的条目值。
因此,交换元素不是解决方案。

int x = 0, y = 0, input[20], current, temp;

main(){
    srand((unsigned)time(NULL));

    for (x = 0; x < 20;x++){
        input[x] = rand() % 20 + 1;

        for (y = 0; y < 20; y++){
            if (input[x] == input[y]){
                if (y != x){
                    input[x] = rand() % 20 + 1;
                    y = 0;
                }
            }
        }

    }

    for (x = 0; x < 20; x++){
        printf("Input[%d]: %d\n", x + 1, input[x]);
    }

    getch();
}

2 个答案:

答案 0 :(得分:4)

除了一些明显的问题(见评论......)

如果找到重复项,则会生成一个新数字,但不会重新检查重复项,因此不会将其与数组中的先前值进行比较。

答案 1 :(得分:0)

您可以使用布尔数组并使用直接散列。 让我们说r是第一个随机数。 make input[r]=1;现在,当生成下一个随机数时,您只需检查它是否先前使用

生成
if(!input[r])
{
...
}

现在每次条件为假时,将循环计数器递减1.

  for (x = 0; x < 20; x++)
  {
    int r=rand()%20+1;
    if(!arr[r])
      printf("%d\n",r);
    else
      x--;
    arr[r]=1;    
  }