最近我开始开发一个简单的游戏。这是我开发的早期版本的改进版本。游戏的成功很大程度上取决于在不同模式下随机数的生成:
MODE1 -真正的随机模式
myRand(min,max,mode=1);
MODE2 -伪随机:从袋子模式中提取令牌
myRand(min,max,mode=2);
MODE3 -伪随机:人类模式
myRand(min,max,mode=3);
*假设代码时间紧迫(即欢迎任何性能优化)
*伪代码可以执行,但我需要的是用C实现。
*请保持简单。一个函数就足够了(这就是我要找的)
谢谢
发布于 2010-04-19 11:34:52
首先,研究Mersenne Twister。这应该是你问题的一个极好的基础。
模式1:直接使用这些值。假设值为32位,取决于最小和最大的范围,模( max - min +1)可能足够好,但如果这个间隔不是2的幂,则存在较小的偏差。否则,您可以将该值视为0到1之间的浮点值,并需要一些附加操作。也许还有其他的解决方案来得到与整数相等的分布,但我还没有研究过这个特定的问题。维基百科在这里可能会有所帮助。
模式2:使用一个用min..max填充的数组,然后对其进行洗牌。按顺序返回被洗牌的值。当你通过数组,重新填充和重新洗牌。
模式3是最复杂的。少量的随机值显示集群,也就是说,如果计算不同值的出现次数,则有一个平均值,并且计数通常高于或低于此平均值。正如我理解你们之间的联系一样,人类期望随机性在平均水平上具有所有的精确性。因此,根据它们与平均计数的距离,计算出发生的次数并给出不同的值更高的概率。简单地对多个数组重用模式2就足够了,例如,使用10倍于(max- min+1 )大小的数组,用10倍min、10倍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可能是一个很好的选择。
发布于 2010-04-19 10:27:57
作为第一步,去读Knuth吧。
发布于 2010-04-19 11:08:17
如果max-min = 2^N-1,则可以对模式2使用线性反馈移位寄存器.这种随机发生器产生具有N位内存储器的2^N1数的重复序列.有关更详细的解释和代码,请参见http://en.wikipedia.org/wiki/LFSR。
https://stackoverflow.com/questions/2666590
复制相似问题