C中的rand()有多独特?

我使用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 ++在提供了一个更好的随机数库。 它提供了不同的PRNG算法,例如linear_congruential,mersennne_twister,甚至可能是加密安全的RNG(取决于实现)。 它还提供了用于生成各种分布的对象,例如uniform_int_distribution,它应该避免在rand() % N出错。

rand()返回0到RAND_MAX之间的值。 由于它是离散均匀分布,因此重复数字的概率为1 /( RAND_MAX +1),因此无法保证唯一性。

srand(seed)初始化你的随机数生成器,这样每次从seed初始化它时,从rand()获得的数字序列是相同的。

在你的例子中, seed = time(NULL)是从1970年1月1日开始经过的秒数,从而确保了不同的种子,因此每次调用srand(time(NULL))的随机数序列都不同(假设它是不是在同一秒内制造的)。

随机数是随机的 ,不是唯一的 。 就像掷骰子的情况一样,当你可以连续掷出几个六个时,你的rand可以(而且应该)给你一些相同的数字。

为了确保数字是唯一的,建立一个集合,您可以在其中注册已添加的每个数字。 当一个随机数出现不止一次时,扔掉第二个,然后去下一个。

什么是赔率,rand()可以在连续或频繁的通话中给我类似的值?

rand的算法在C中未指定。因此rand返回的数字的随机性质量。

在此处输入图像描述