首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C中的随机数生成

C中的随机数生成
EN

Stack Overflow用户
提问于 2010-04-19 10:26:16
回答 4查看 1.7K关注 0票数 3

最近我开始开发一个简单的游戏。这是我开发的早期版本的改进版本。游戏的成功很大程度上取决于在不同模式下随机数的生成:

MODE1 -真正的随机模式

myRand(min,max,mode=1);

  • 应该返回一个随机整数b/w min & max。

MODE2 -伪随机:从袋子模式中提取令牌

myRand(min,max,mode=2);

  • 应该返回一个随机整数b/w min & max。此外,还应该在内部跟踪返回的值,并且在所有其他值至少返回一次之前,不能再次返回相同的值。

MODE3 -伪随机:人类模式

myRand(min,max,mode=3);

  • 应该返回一个随机整数b/w min & max。随机化不应该仅仅是数学上的随机,而是用户所认为的随机。人类如何看待随机

*假设代码时间紧迫(即欢迎任何性能优化)

*伪代码可以执行,但我需要的是用C实现。

*请保持简单。一个函数就足够了(这就是我要找的)

谢谢

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 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:

代码语言:javascript
运行
复制
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:

代码语言:javascript
运行
复制
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

不同的事件也应该有不同的概率,这取决于它们与平均值的距离:

代码语言:javascript
运行
复制
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可能是一个很好的选择。

票数 4
EN

Stack Overflow用户

发布于 2010-04-19 10:27:57

作为第一步,去读Knuth吧。

票数 3
EN

Stack Overflow用户

发布于 2010-04-19 11:08:17

如果max-min = 2^N-1,则可以对模式2使用线性反馈移位寄存器.这种随机发生器产生具有N位内存储器的2^N1数的重复序列.有关更详细的解释和代码,请参见http://en.wikipedia.org/wiki/LFSR

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2666590

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档