这是我的第一个问题,我正在做一个小游戏,而且为了分配角色,我需要随机数字。我有这个代码,但有可能不重复这些数字?感谢。
void giveroles() {
srand(time(NULL));
int r = rand() % i + 1;
switch ( r ) { /* ... */ }
}
答案 0 :(得分:4)
如果要随机分配一小组数字,而不是随机生成它们,请创建所需数字列表,然后随机化列表顺序(遍历列表,随机交换条目)。
例如:
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()的范围不会是偶数倍。
答案 1 :(得分:3)
取出srand(time(NULL));
行。您通常只应在程序中执行此操作,例如:在main()
的开头,以便随后调用后续调用rand()
使用的种子。
答案 2 :(得分:3)
如果您不想重复随机数,解决方法是跟踪您之前使用过的随机数,如果您在现有数字列表中获得“点击”,请重试。
此外,使用srand(time(NULL));
只应该执行一次。我怀疑这更像是你实际问的问题。