首先,研究Mersenne Twister是一个很好的解决方案。
模式1:直接使用值。由于这些值是32位的,根据最小值和最大值的范围,模(max-min+1)可能已经足够了,但如果该区间不是2的幂,则存在一定偏差。否则,您可以将该值视为介于0和1之间的浮点值,并需要进行一些额外的操作。可能有其他解决方案来获得相等的整数分布,但我尚未研究过这个特定的问题。Wikipedia在这里可能会有所帮助。
模式2:使用填充min..max数组并随机排序的方法。按顺序返回洗牌后的值。当您完成数组时,请重新填充并重新洗牌。
模式3是最复杂的。少量的随机值会显示出聚类现象,即如果您计算不同值的出现次数,则会有一个平均值,并且计数通常高于或低于此平均值。就我理解的您的链接而言,人们希望随机性的所有计数都恰好在平均值上。因此,计算发生的次数并给予不同的值更高的概率,具体取决于它们与平均计数的距离。只需使用多重数组再次重复模式2即可,例如使用10倍于(max-min+1)大小的数组,用10x min、10x min+1等填充它,然后对其进行洗牌。每满10轮,您就可以确保计数完全相等。
关于模式3的编辑:
假设min=1且max=5。您计算出现次数。如果它们都具有相同的概率(使用良好的随机生成器应该是如此),则每个值发生的概率为0.2,因为概率加起来为1.0:
Value Occur Probability
1 7x 0.2
2 7x 0.2
3 7x 0.2
4 7x 0.2
5 7x 0.2
Average: 7x
但是现在假设数字3只出现了5次,数字5出现了9次。如果你想保持均等分布,那么数字3必须成为更高的概率来赶上平均出现次数,数字5必须成为更低的概率,以免增长过快,直到所有其他值都赶上。尽管如此,所有单个概率的总和必须为1.0:
Value Occur Probability
1 7x 0.2
2 7x 0.2
3 5x 0.3
4 7x 0.2
5 9x 0.1
Average: Still 7x
不同的事件发生概率也应该不同,这取决于它们与平均值的距离:
Value Occur Probability
1 10x 0.05
2 4x 0.35
3 5x 0.3
4 7x 0.2
5 9x 0.1
Average: Still 7x
实现并不那么琐碎,但很可能非常缓慢,因为随机生成器仍然提供相等的概率,因此修改后的模式2可能是一个足够好的选择。