如何C编译器是否需要应在随机数生成函数接下来将生成的数字决定?例如,它总是在给定范围内生成一个新的随机数。这是如何完成的?
Q
逻辑
2
A
回答
1
这取决于所讨论的伪随机数生成器(PRNG)的具体实现。使用中有很多变体。
一个常见的例子是linear congruential generators(LCG)的家族。这些是通过递归关系来定义:
X n + 1个 < - AX Ñ + C(mod M)表示
于是从PRNG每个新样品通过先前采样书确定,以及常数a,c和m。请注意,a,c和m的选择至关重要,如讨论here。
LCGs非常简单和高效。它们通常用于标准库提供的随机数生成器。然而,它们具有差的统计特性并且为了更好的随机性,更优先的PRNG是优选的。
1
它通过保持一些状态并在每次调用函数时修改状态来生成下一个数字。这种功能被称为伪随机数发生器。创建PRNG的老方法是线性同余发生器,这是很容易的:
static int rand_state;
int rand(void)
{
rand_state = (rand_state * 1103515245 + 12345) & 0x7fffffff;
return rand_state;
}
正如你所看到的,这个方法可以让你预测该系列中的下一个号码,如果你知道前面数。有更复杂的方法。
各种类型的伪随机数发生器已被设计用于特定目的。有一些安全的PRNGs很慢但很难预测,即使你知道它们是如何工作的,也有像Mersenne Twister这样的大型PRNG,它们具有很好的分布特性,因此可用于编写蒙特卡洛模拟。作为一个经验法则,一个线性同余发生器足够用于编写一个游戏(怪物交易造成多少伤害),但对编写一个模拟程序来说还不够好。有许多研究人员选择贫穷的PRNG作为他们的项目的丰富的历史;他们的模拟结果是可疑的结果。
1
它不是一个编译器,而是一个C库,它具有产生伪随机数(不是真正的随机数)的函数。
1
那么,C编译器不会采取这种决定。下一个随机数取决于算法。生成随机数并不是一件容易的事。看看
0
0
这实际上是一个非常大的话题。一些关键的东西:
- 随机数的产生是在运行时完成的,而不是编译时。
- 提供随机性的策略取决于(或应该取决于)应用程序。例如,如果您只需要在给定范围内均匀分布的一系列值,则可以使用线性同余发生器等解决方案。如果您的应用程序与安全/加密相关,则您需要更强大的属性,以确保您的值既是随机分布的,也是不可预测的。
- 一个主要的挑战是获取“真正的”随机性,您可以使用它来为您的伪随机生成器播种(将实际随机性“拉伸”为任意数量的可用随机性)。一种常见的技术是使用一些不可预测的系统状态(例如,采样鼠标位置或按键计时),然后使用伪随机生成器来为整个系统提供随机性。
相关问题
- 1. 布尔逻辑(逻辑门)
- 2. “逻辑”
- 3. 逻辑
- 4. 逻辑
- 5. 逻辑
- 6. 逻辑
- 7. 逻辑
- 8. 散列逻辑内的逻辑
- 9. DotNetZip循环逻辑的逻辑帮助
- 10. 查询逻辑与程序逻辑
- 11. Java逻辑XOR(“^”)与逻辑NOT(“!”)
- 12. 域逻辑和业务逻辑
- 13. 模型逻辑和服务层逻辑
- 14. 正确的OOP类逻辑的逻辑
- 15. talend tMap逻辑vs SQL逻辑 - 性能
- 16. 演示逻辑vs UI逻辑
- 17. 演示逻辑或业务逻辑?
- 18. propostional逻辑和判刑谓词逻辑
- 19. SASS(CSS)逻辑vs JQuery(Javascript)逻辑
- 20. JavaScript中的短手逻辑逻辑
- 21. 2列的逻辑运算(逻辑或)
- 22. 根据逻辑
- 23. 命题逻辑
- 24. 重试逻辑
- 25. Abbout Memcache逻辑
- 26. 逻辑问题
- 27. 比较逻辑
- 28. 算法逻辑
- 29. 业务逻辑
- 30. 逻辑问题
我注意到的问题是每次运行程序时都会产生相同的随机数序列。因此,种子进来。 – SparKot
阅读此:[随机数生成器在C](http://stackoverflow.com/questions/12885171/logic-behind-the-random-number-generator-in-c) –