我将rand()用于需要唯一值的6位数字字段。我做对了吗?
rand()在连续或频繁致电时给我类似值的可能性是多少?

当我使用rand()时,它是唯一的。但是,当我调用srand(time(NULL))srand(clock())时,返回了相同的数字。似乎对我来说相反。还是?

最佳答案

正如其他人指出的那样,不能保证唯一性。但是,您可能会看到重复的数字,因为您错误地使用了srand()和rand()。

srand()用于为随机数生成器提供种子。这意味着在对srand的调用之后对rand()的一系列调用将产生一系列特定的值。如果您使用相同的值调用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

time()和clock()返回时间,但是如果您足够快地调用它们,那么返回的值将是相同的,因此将从rand()中获得相同的一系列值。

另外,rand()通常不是一个很好的随机数生成器,使用它通常意味着您必须将一系列数字转换为实际需要的分布。您应该找到不同的随机性来源,或者学习产生所需分布的正确方法,或者使用可以为您做的分布的库。 (例如,产生0到N之间的“随机”数的一种常见方法是执行rand() % N,但这并不是最好的方法。

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

10-06 13:16