这是我的第一个问题在这里,我正在做一个小游戏,并分配角色,我需要的随机数。 我有这样的代码,但有可能是数字不重复? 谢谢。
void giveroles() {
srand(time(NULL));
int r = rand() % i + 1;
switch ( r ) { /* ... */ }
}
这是我的第一个问题在这里,我正在做一个小游戏,并分配角色,我需要的随机数。 我有这样的代码,但有可能是数字不重复? 谢谢。
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;
}
(应当进一步指出,服用)兰特的模块(也可能有偏差,作为兰特(范围内)不会是偶数倍)
取出线srand(time(NULL));
。 你应该在一般只能用在你的程序中,例如在开始做一次main()
,为了随机使用的后续调用的种子rand()
。
如果你不想重复随机数,解决的办法是跟踪其随机数字您以前使用的,如果你得到一个“打”在现有的号码列表,再试一次。
此外,使用srand(time(NULL));
只应做一次。 我怀疑这是你越实际上是问这个问题。