【发布时间】:2015-01-04 04:49:17
【问题描述】:
我正在尝试使用 srand() 在 C 中生成随机数。我想生成从 1 到 25 的数字而不重复,所以我实现了以下程序。
#include <stdio.h>
#include <time.h>
int main()
{
int i=0,n,a[25]={0},b[25]={0},cntr=0;
srand(time(NULL));
while(cntr!=25)
{
n=rand()%26;
if(n!=9)
{
if(a[n]!=1)
{
a[n]=1;
printf("%d ",n);
b[i]=n;
printf("%d\n",b[i]);
cntr++;
i++;
}
}
}
for(i=0;i<25;i++)
{
printf("%d ",b[i]);
}
return 0;
}
现在有一个奇怪的问题。当我在生成随机数的循环内打印数组 b 时,它会打印正确的数字。但是当我在循环外打印它时,数组 b 的第一个元素变为 1,我在随机数中得到重复值 1。如果有人能帮助找出程序中的错误,我将不胜感激。
这是我提供程序输出的 ideone 的链接:Ideone Link
【问题讨论】:
-
一个提示 - 以有意义的方式命名你的变量,愚蠢错误的原因就很清楚了。
-
@TymoteuszPaul 我已经检查了很多次但找不到。这就是我寻求帮助的原因
-
我给了你一个非常简单的方法来找到它——重命名你的变量,让它们有意义。因此,当我查看
a[n]=1;时,很清楚该数组的名称是什么,索引是什么,内容是什么。 -
您似乎正在尝试生成 [0,25] 中除 9 之外的整数的随机排列。有比这更有效的方法来生成随机排列。
-
@harsh-jani 您可以从搜索“随机排列算法”开始。 Fisher-Yates Shuffle 是一种方法。基本上,与其生成数字并丢弃任何重复项,直到您拥有所需的所有数字,不如生成一个包含所有您想要的数字的数组,然后将每个位置与随机位置交换。