【发布时间】:2009-01-26 12:04:43
【问题描述】:
我对组装真的很陌生,我正在尝试创建一个简单的程序。为此,我需要生成一个随机数。
有人知道我如何使用 FASM 编译器做到这一点吗?
【问题讨论】:
-
Mersenne twister 广泛用于随机数生成。它比许多其他伪随机数生成器产生更好的分布,但计算成本更高。
标签: assembly random numbers fasm
我对组装真的很陌生,我正在尝试创建一个简单的程序。为此,我需要生成一个随机数。
有人知道我如何使用 FASM 编译器做到这一点吗?
【问题讨论】:
标签: assembly random numbers fasm
您可以使用线性同余算法。它是最常见的伪随机数算法。
基本上,你有一个种子值。然后,一旦您开始生成随机数,每个数字都会成为新请求的种子。
数字是由
生成的x = (a * s + b) MOD m
其中 m、a 和 b 被选为算法。使用了一些流行的这些值集。如果您将 m 设为 2 的幂,它会容易得多,尤其是 32 位机器的 2^32。然后mod步骤由机器自动完成。
查看维基百科,他们有流行的 a、b 和 M 集以及更多信息。
种子也可以做更复杂的事情(例如,根据当前时间设置种子)
【讨论】:
我是 R250 的忠实粉丝,它的执行速度比 LCG 快得多。 http://www.ddj.com/184408549?pgno=7
在我以前写回的旧汇编代码中显示速度显着提高。
【讨论】:
看看this Wikipedia page,选择一个算法,然后实现它。
编辑:或者你可以走简单的路线。使用您操作系统的 C 运行时并调用它们的 rand 函数。
【讨论】:
随机数
这是一个有点模棱两可的问题。
到目前为止,大多数海报可能都是正确的;他们正在解释如何生成 pseudo-随机数,这可能就是您所需要的。用当前时间播种算法(您必须向操作系统询问,或从时钟芯片中读取)。这将为您提供足以用于游戏和其他简单用途的“随机”数字。
但是请不要将这些“随机数”用于任何安全应用(加密、密钥生成等)。对于安全应用程序,您需要一个非常好的密码安全随机数生成器。写其中一个真的很难。 (Netscape got it wrong 所以早期版本的 Netscape Navigator 有一个易于破解的 HTTPS 实现;最近的 Debian got it wrong 导致大量易于破解的 SSH 和 HTTPS/SSL 密钥)。
【讨论】: