我将 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/