如何使用 1--4 范围内的汇编代码生成随机数?
user305624
问问题
2460 次
4 回答
3
1 + (rand() % 4),一般来说(其中 rand() 是一个不错的随机整数生成器)。
call [_rand]
mod eax, 4 ; or 'and eax, 3' - same thing
inc eax
你可以去阅读说Mersenne Twister,了解如何实现 rand(),但它非常复杂。
于 2010-03-31T02:12:13.603 回答
1
这是一种简单的技术,可以在某种程度上获得“随机”数字(虽然它不是真正随机的),如果 API 不提供
- 可变时间 = 获取系统时间
- 变量余数 = 时间 % 4
- 变量随机数 = 时间 + 1
您可以将其用于每种语言(前提是您可以访问时间)。
对于 68K 的高级随机数生成器,您可以查看此链接。
于 2010-03-31T17:42:35.827 回答
1
你可以做自己的准随机数发生器。如果您可以访问 RTC(真实时钟计数器)或 CPU 时间戳,那么您可以做相对简单的 rutine。
非常简单的例子:
Int LastIteration;
Int IterationCounter;
...
++IterationCounter;
LastIteration = CpuTimeStamp + IterationCounter;
RndNum = LastIteration & 3 + 1;
如果您每秒不需要大量生成的数字,那么这个准 rnd 生成器就足够不可预测了。
于 2010-03-31T07:15:09.110 回答
0
不知道您要在哪个系统上执行此操作,所以这里有一个通用答案,无论哪个都应该适用:
query the system time, using whatever syscall / library call / api you have available
and out the top bits, leaving only the lowest 2
塔达。随机数。
如果您希望它们更随机使用,可以这样做:
query the system time
and out the top bits leaving only the lowest 4 store in "register1"
Loop:
do something unimportant
do something else unimportant
etc.
count down register1
jump to EndLoop if register1==0
jump Loop
EndLoop:
query the system time
and out the top bits, leaving just the lower two
干杯!
/B2S
编辑:对不起,在互联网无法到达的地方度假。(是的,这样的地方仍然存在真是令人惊讶)我对 EyeBot 和 68k asm 都不是特别熟悉。所以我不知道读取时钟或时间的系统调用(两者都可以)。所以看那个,其余的代码应该是这样的
//Assuming you have called the syscall to get the system time/clock, and stored it in D0
AND #%01111, D0
loop:
// It really doesn't matter,
// What Instructions you put here,
// just put 4 or 5 instructions that don't
// mess with D0, eg. AND, MOVE, ADD, AND, OR
SUB #1, D0
TST D0 // TST instruction is probably not needed
BEQ EndLoop
JMP loop
EndLoop:
// Get the system time/clock again (Next instruction assumes clock is in D0)
AND #%011, D0
D0 现在应该包含您的随机数
于 2010-03-31T02:17:48.067 回答