如何独特的是兰特(c)中?(How unique is rand() in C?)

2019-06-28 08:24发布

我使用rand()于需要唯一值的6位字段。 我这样做对吗?

有多大, rand()可以给我类似值连续或频繁的电话?

当我用兰特这是唯一的()。 但是,返回相同数量的时候我叫srand(time(NULL))srand(clock()) 看来,喜欢它的工作相对来说我。 是这样吗?

Answer 1:

正如其他人所指出的那样,唯一性无法得到保证。 但是,由于您使用的函数srand()和RAND()不正确,你很可能看到重复的数字。

srand()函数是用于接种的随机数发生器。 这意味着一系列调用调用函数srand将产生特定的一系列值后兰特()的。 如果调用函数srand()使用相同的值,则RAND()会产生相同的一系列值(对于给定的实现,有不同的实现之间没有保证)

int main() {
    srand(100);
    for(int i = 0; i<5; ++i)
        printf("%d\n",rand());

    printf("\nreset\n\n");

    srand(100);
    for(int i = 0; i<5; ++i)
        printf("%d\n",rand());

}

对我来说这将产生:

365
1216
5415
16704
24504

reset

365
1216
5415
16704
24504

时间()和clock()返回的时间,但如果你打电话给他们足够快,则返回的值是一样的,所以你会得到相同的数值系列的出兰特()。

此外兰特()一般不会有很好的随机数生成器并使用它通常意味着你必须在一系列的数字转化为实际需要分配。 你会发现随机性的不同来源,要么学会正确的方法来生成所需的分配或使用,可以为你做一个图书馆。 (例如一个0和N之间产生一个“随机”数的常用方法是做rand() % N ,但这不是真正的最佳方法。

C ++中提供了一个更好的随机数库<random> 。 它提供了不同的PRNG算法,如linear_congruential,mersennne_twister,甚至可能是加密的安全RNG(取决于实施方式)。 它还提供了用于对象生产多种分布,如uniform_int_distribution应避免错误的使rand() % N



Answer 2:

rand()返回0之间的值RAND_MAX 。 因为它是一个离散均匀分布,则有1 /(的概率RAND_MAX重复若干1),因此,唯一性无法得到保证。

srand(seed) ,以便从获得的数字序列初始化您的随机数发生器rand()是你初始化它给予相同的每一次seed每一次。

在你的例子seed = time(NULL)其是从1月1日起经过的秒数,1970从而确保不同的种子,并且因此不同的序列的随机数的每一个调用srand(time(NULL))假定它是相同的第二内没有作出)。



Answer 3:

随机数是随机的 ,不是唯一的 。 就像用掷骰子的情况时,你可以在一排滚动几个乱七八糟,你rand可以(也应该),有时给你相同数量的运行。

为了确保该号码是唯一的,建立一套在那里你注册的每个您已经添加的数字。 当一个随机数出现不止一次,抛出第​​二个客场,和去下一个。



Answer 4:

有多大,RAND()可以给我类似值连续或频繁的电话?

的算法rand是C.不确定因此利用返回的数的随机性质量rand



文章来源: How unique is rand() in C?