在[0,n)中选择随机数的一种常用方法是采用rand()模n的结果:rand() % n.但是,即使可用rand()实现返回的结果完全一致,当n = n均匀分配时,结果[0,n]数的均匀性是否应该存在问题?例如假设为2,n为2.然后,在3个可能的输出中:0,1和2,当我们使用模n时,我们分别得到0,1和0 .因此输出将根本不是均匀的.RAND_MAX + 1RAND_MAXrand()
这在实践中是一个真正的问题吗?选择[0,n]中的随机数是一种更好的方法,从rand()输出中均匀推导出来,最好没有任何浮点运算?
你是对的,rand() % N不是精确均匀分布的.确切地说,重要的是多少取决于你想要的数字范围和你想要的随机程度,但如果你想要足够的随机性,你甚至不关心它,你也不想使用它rand().获得一个真正的随机数生成器.
也就是说,要得到一个真正的随机分布,mod到下一个2的幂并进行采样,直到你得到一个你想要的范围(例如0-9,使用while(n = rand()%0x10 > 10);).
这取决于:
让我们假设您的 RAND_MAX 是 2^32。如果 N 相当小(假设为 2),则偏差为 1 / 2^31 —— 或者太小而无法注意到。
但是如果 N 大一点,比如 2^20,那么偏差就是 1 / 2^12,或者大约是 4096 中的 1。大很多,但仍然很小。