这是我在这里的第一个问题,我正在制作一个小游戏,为了分配角色,我需要随机数。我有这个代码,但是数字可能不重复吗?谢谢。
void giveroles() {
srand(time(NULL));
int r = rand() % i + 1;
switch ( r ) { /* ... */ }
}
如果要随机分配一小组数字,而不是随机生成它们,请创建所需数字的列表,然后随机化列表的顺序(遍历列表,随机交换条目)。
例如:
int cards[52];
for(int i = 0 ; i < 52 ; i++)
{
cards[i] = i;
}
for(int i = 0 ; i < 1000 ; i++)
{
int r1 = rand()%52;
int r2 = rand()%52;
int t = cards[r1];
cards[r1] = cards[r2];
cards[r2] = t;
}
for(int i = 0 ; i < 52 ; i++)
{
printf("%d\n", cards[i]);
}
为了完整起见,已经指出以这种方式洗牌是有偏见的。这是一个应该不偏不倚的变体:
cards[0] = 0;
for(int i = 1 ; i < 52 ; i++)
{
int r = rand() % (i+1);
cards[i] = cards[r];
cards[r] = i;
}
(需要进一步注意的是,取rand()的模块也可能有偏差,因为rand()的范围不会是偶数)
取出线srand(time(NULL));
。通常,您应该只在程序中执行一次此操作,例如在开始时main()
,以便随机化后续调用使用的种子rand()
。
如果您不想重复随机数,解决方案是跟踪您以前使用过哪些随机数,如果您在现有数字列表中获得“命中”,请再试一次。
此外,使用srand(time(NULL));
应该只进行一次。我怀疑这更像是您实际提出的问题。