2012-12-23 73 views
1

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

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

在linux系统中,你也可以阅读'/ dev/randdom' –

+0

@ shiplu.mokadd.im如果你的系统没有足够的熵,那么这可能需要很长的时间。使用/ dev/urandom更快,尽管可能不是那么随机的数字。 – fuz

回答

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; 
} 

+0

谢谢@JasonD,我只是尝试了一些类似的工作:P – xacobe97

+0

Shuffling是一个好主意,但是这种洗牌会导致产出偏差 - 并非所有的安排都会有同样的可能性。试试[Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle),它也允许初始化数组_shuffling_。 –

+0

为真,'rand()%x'也有偏差。尽管如此,我怀疑这并不重要。 – JasonD

3

取出线srand(time(NULL));。一般而言,您只需在程序中执行一次该操作,例如在main()的开头,为了随机化后续调用使用的种子到rand()

3

如果您不想重复随机数,解决方案是跟踪您之前使用过的随机数,并且如果您在现有数字列表中出现“点击”,请再试一次。

此外,使用srand(time(NULL));应该只做一次。我怀疑这更像是你实际问到的问题。