【问题标题】:internal implementation of random()random() 的内部实现
【发布时间】:2015-03-26 00:38:47
【问题描述】:

这是在 Lua 语言中生成随机数的语法--

math.random()

几乎所有的编程语言都有这个语法相似的函数。我的问题是这个函数是如何实现的。它是如何生成随机输出的?

【问题讨论】:

  • 你试过查看函数的源代码吗?
  • 它使用标准 C 库中的函数(randrandom 在 POSIX 系统上)。正如 Etan 所提到的,您可能会认为自己的 Lua 源是免费提供的。

标签: math random lua


【解决方案1】:

伪随机算法通过从现有种子值生成看似任意的位模式来工作。然后将生成的值保存为下一个随机数的种子。

大多数随机生成器最初都使用来自系统时钟的值作为种子。虽然时间是一个相对可预测的值,但一旦通过随机算法一次,它就足够随机了(对于大多数应用程序而言)。

该算法会产生一系列看似无关的值,因此可以将它们用作随机值。由于值之间自然存在关系,即使非常复杂,这些值实际上也是伪随机的。


当计算机速度较慢且机器字较小时使用的一种简单随机算法是将种子值乘以素数,加一,然后得到机器字所需的低位。示例(C#):

static ushort seed = 42; 

public static ushort random() {
  seed = (ushort)(seed * 8747 + 1);
  return seed;
}

函数在前 100 次被调用时返回这些值:

39695  2438 25987 29442 38231 41886 30603 35418 12575 24118 65299 24114
30311 37198 50203 34442 60719  5350  3747  7010 40311 16638 42667 46266
 3903 60822 54323 27282 19079 29358 24379 54506 55119 43078 36803  3010
48535 58974 11723 42778 34143  1270 33107 48882 13991 23566 21083 60234
22895 50086 59619 17442 62903 37822  3307 24954 37759 42070  1651 23378
15047 19822 40315 51626 29583 26374  6659 50306 17879 18718 17419 58330
14751 52150 25491 16306 22247 18126 16539 28682  9647 37478  8995 36066
44535  1662 54059 11834 30655 31510 39091 27666 35591 18478 15291 56938
28623 17862  1091 40258

如您所见,即使是这样一个简单的算法也能得到很好的结果。然而,现代随机生成器使用更复杂的算法,例如 Mersenne twister

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-31
    • 2017-07-06
    • 1970-01-01
    • 2012-07-08
    • 1970-01-01
    • 1970-01-01
    • 2015-11-02
    • 2014-01-18
    相关资源
    最近更新 更多