gpt4 book ai didi

c - C 中的 rand() 有多独特?

转载 作者:行者123 更新时间:2023-12-01 16:13:52 25 4
gpt4 key购买 nike

我将 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 中犯的错误。 .

关于c - C 中的 rand() 有多独特?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12412108/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com