1

如何使用 1--4 范围内的汇编代码生成随机数?

4

4 回答 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 不提供

  1. 可变时间 = 获取系统时间
  2. 变量余数 = 时间 % 4
  3. 变量随机数 = 时间 + 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 回答