1

这是我在这里的第一个问题,我正在制作一个小游戏,为了分配角色,我需要随机数。我有这个代码,但是数字可能不重复吗?谢谢。

void giveroles() {
    srand(time(NULL));
    int r = rand() % i + 1; 
    switch ( r ) { /* ... */ }
}
4

3 回答 3

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()的范围不会是偶数)

于 2012-12-23T12:40:18.510 回答
3

取出线srand(time(NULL));。通常,您应该只在程序中执行一次此操作,例如在开始时main(),以便随机化后续调用使用的种子rand()

于 2012-12-23T12:26:33.547 回答
3

如果您不想重复随机数,解决方案是跟踪您以前使用过哪些随机数,如果您在现有数字列表中获得“命中”,请再试一次。

此外,使用srand(time(NULL));应该只进行一次。我怀疑这更像是您实际提出的问题。

于 2012-12-23T12:29:06.827 回答