使用FASM编译器在汇编语言中生成随机数的方法是什么?

3

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

有人知道如何在 FASM 编译器中实现吗?


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

5
您可以使用线性同余算法。这是最常见的伪随机数算法。
基本上,您有一个种子值。然后一旦开始生成随机数,每个数字都成为新请求的种子。
数字的生成方式为:
x = (a * s + b) MOD m
其中,m、a和b是选择算法的参数。有一些流行的这些值的集合可供使用。如果将m设置为2的幂,特别是32位机器的2^32,则自动执行模操作。
请查看维基百科,其中有流行的a、b和M集合以及更多信息。
还可以使用更复杂的种子(例如根据当前时间设置种子)。

+1 - 线性同余伪随机数生成器在汇编语言中实现起来非常容易。 - ConcernedOfTunbridgeWells
除法是缓慢和不方便的,虽然可以在少数x86指令中完成;xorshift*或线性反馈移位寄存器也很好,而且更快,但可能需要更多的指令。(http://prng.di.unimi.it/xoroshiro128plus.c在64位模式下很好,使用64位旋转在汇编语言中比C语言更容易。) xorshift+在任何模式下都可以使用XMM寄存器方便地实现。 - Peter Cordes

2
我是R250的忠实粉丝,它比LCG执行速度更快。在我以前编写的旧汇编代码中,R250表现出了显著的速度提升。 http://www.ddj.com/184408549?pgno=7

1

看一下这个维基百科页面,选择一个算法并实现它。

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


尽管这理论上回答了问题,但我们希望您在回答中包含相关文章的重要部分,并提供参考链接。如果未能做到这一点,答案可能因链接失效而处于风险之中。 - Kev

0
随机数
这是一个稍微有点模糊的问题。
到目前为止,大多数帖子可能都是正确的;它们解释了如何生成一个伪随机数,这可能是您需要的。用当前时间作为算法的种子(您将不得不向操作系统询问或从时钟芯片读取)。这将为您提供足够好的“随机”数字,适用于游戏和其他简单用途。
但是,请不要将这些“随机数”用于任何安全应用程序(加密、密钥生成等)。对于安全应用程序,您需要一个真正好的密码学安全的随机数生成器。编写这样的生成器非常困难。(Netscape 搞错了,因此早期版本的Netscape Navigator具有易于攻击的HTTPS实现;Debian最近搞错了,导致大量易于攻击的SSH和HTTPS / SSL密钥)。

1
我同意这是有歧义的。不同的应用需要许多不同类型的随机数。包括密码学、游戏和一些琐碎的用途。从问题的描述来看,我认为Sam只需要一个简单的生成器来测试他的程序。 - Tony Peterson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接