创建随机数

时间:2012-12-23 12:25:41

标签: c random

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

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

3 个答案:

答案 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));只应该执行一次。我怀疑这更像是你实际问的问题。