这是我的第一个问题,我正在做一个小游戏,为了分配角色,我需要随机数。我有这个代码,但有可能数字不会被重复?谢谢。创建随机数
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));
应该只做一次。我怀疑这更像是你实际问到的问题。
在linux系统中,你也可以阅读'/ dev/randdom' –
@ shiplu.mokadd.im如果你的系统没有足够的熵,那么这可能需要很长的时间。使用/ dev/urandom更快,尽管可能不是那么随机的数字。 – fuz