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