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

标签 c random unique uniqueidentifier

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

相关文章:

c - 哈希表中的段错误 - C

C在while条件内的函数内递增变量

c - 指向带 argv 的指针的指针

python - random.randint 非整数? [Python]

hibernate - 如何在 Hibernate 中使用唯一键而不是主键检索记录

c - 在拇指驱动器上使用 open()

javascript - 使用javascript在浏览器中显示数组中的一行随机图片

dart - 如果不需要加密强随机数,使用 Random() 比使用 Random.secure() 是否有优势?

python - 将 DataFrame 列中的唯一值替换为其计数

python-3.x - 从元组组合对列表中进行选择,使得每个元组元素至少出现两次