我在用rand()
对于需要唯一值的 6 位字段。我做对了吗?
几率有多大,rand()
可以在连续或频繁的通话中给我类似的值吗?
当我使用 rand() 时,它是独一无二的。但是,当我打电话时返回相同的号码srand(time(NULL))
or 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
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)