【发布时间】:2015-02-08 22:09:04
【问题描述】:
我写了一个小的随机数字程序,它利用 RDTSC 给我随机性。我使用 FASM 在 Linux Mint 17 上编写了它。
问题是,它在 AMD FX 64 位 PC 上完美运行,但在 Windows 8 和 Linux Mint 下,英特尔赛扬上网本(64 位)上的确切代码失败(或挂起)(我双启动,所以我为 Win 8 修改了代码)
这可能是什么问题?这基本上是代码;
again:
rdtsc
and eax,1111b
cmp eax,10
jae again
;things to do with the random digit
我调试了一下,发现罪魁祸首隐藏在这部分代码中。但我也看不出有什么问题。它在我的 AMD PC 上完美运行。英特尔 CPU 是否默认禁用 RDTSC?
【问题讨论】:
-
Err... 我强烈建议不要使用
rdtsc来获得随机性。它的一个问题是,如果在循环中调用,这样的函数将给出某个步长值的连续倍数加上一个偏移量(即,如果每次循环迭代需要 4 个总线周期,您可能会得到 1、5、9、13 ,1,5,9,13,...)。仅获取奇数或仅偶数值,或仅交替奇数/偶数值根本不是很随机。 -
感谢您的回答。但我认为一位数不会有问题。 EAX/RAX 的回报对于一个随机的单个数字来说已经足够好了。无论如何只是一个简单的程序:D
-
你会感到惊讶。如果你想要一些简单而实用的东西,我觉得最适合你的是linear-congruential generator。一个简单的例子:
x_new = 1103515245*x_old + 12345;