【问题标题】:How do you generate a random number in Assembly language using the FASM compiler? [closed]如何使用 FASM 编译器生成汇编语言中的随机数? [关闭]
【发布时间】:2009-01-26 12:04:43
【问题描述】:

我对组装真的很陌生,我正在尝试创建一个简单的程序。为此,我需要生成一个随机数。

有人知道我如何使用 FASM 编译器做到这一点吗?

【问题讨论】:

  • Mersenne twister 广泛用于随机数生成。它比许多其他伪随机数生成器产生更好的分布,但计算成本更高。

标签: assembly random numbers fasm


【解决方案1】:

您可以使用线性同余算法。它是最常见的伪随机数算法。

基本上,你有一个种子值。然后,一旦您开始生成随机数,每个数字都会成为新请求的种子。

数字是由

生成的

x = (a * s + b) MOD m

其中 m、a 和 b 被选为算法。使用了一些流行的这些值集。如果您将 m 设为 2 的幂,它会容易得多,尤其是 32 位机器的 2^32。然后mod步骤由机器自动完成。

查看维基百科,他们有流行的 a、b 和 M 集以及更多信息。

种子也可以做更复杂的事情(例如,根据当前时间设置种子)

【讨论】:

  • +1 - 线性同余 PRNG 很容易在汇编器中实现。
  • 除法很慢而且很不方便,虽然可以用很少的 x86 指令来完成; xorshift* 或线性反馈移位寄存器也不错,速度更快,但可能需要更多指令。 (prng.di.unimi.it/xoroshiro128plus.c 在 64 位模式下很好,使用 64 位循环,这在 asm 中比在 C 中更容易。)xorshift+ 在任一模式下使用 XMM 寄存器都很方便。
【解决方案2】:

我是 R250 的忠实粉丝,它的执行速度比 LCG 快得多。 http://www.ddj.com/184408549?pgno=7

在我以前写回的旧汇编代码中显示速度显着提高。

【讨论】:

    【解决方案3】:

    看看this Wikipedia page,选择一个算法,然后实现它。

    编辑:或者你可以走简单的路线。使用您操作系统的 C 运行时并调用它们的 rand 函数。

    【讨论】:

    • 虽然理论上可以回答这个问题,但我们希望您在回答中包含链接文章的基本部分,并提供link for reference。如果不这样做,答案就会面临链接失效的风险。
    【解决方案4】:

    随机数

    这是一个有点模棱两可的问题。

    到目前为止,大多数海报可能都是正确的;他们正在解释如何生成 pseudo-随机数,这可能就是您所需要的。用当前时间播种算法(您必须向操作系统询问,或从时钟芯片中读取)。这将为您提供足以用于游戏和其他简单用途的“随机”数字。

    但是不要将这些“随机数”用于任何安全应用(加密、密钥生成等)。对于安全应用程序,您需要一个非常好的密码安全随机数生成器。写其中一个真的很难。 (Netscape got it wrong 所以早期版本的 Netscape Navigator 有一个易于破解的 HTTPS 实现;最近的 Debian got it wrong 导致大量易于破解的 SSH 和 HTTPS/SSL 密钥)。

    【讨论】:

    • 我同意它的模棱两可。不同的应用程序需要许多不同类型的随机数。密码学,游戏,然后只是琐碎的用途。从问题的声音来看,我认为 Sam 只需要一个简单的生成器来测试他的程序。
    猜你喜欢
    • 1970-01-01
    • 2010-09-10
    • 1970-01-01
    • 2012-03-18
    • 1970-01-01
    • 2013-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多