随机数生成

时间:2010-03-31 02:06:08

标签: assembly random 68000

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

4 个答案:

答案 0 :(得分:3)

1 +(rand()%4),一般来说(其中rand()是一个不错的随机整数生成器)。

call [_rand]
mod eax, 4 ; or 'and eax, 3' - same thing
inc eax

关于如何实现rand(),你可以去说Mersenne Twister,但这很复杂。

答案 1 :(得分:1)

您可以拥有自己的随机数生成器。 如果你可以访问RTC(实时时钟计数器)或CPU时间戳,那么你可以比较简单。

很简单的例子:

Int LastIteration;
Int IterationCounter;

...


++IterationCounter;
LastIteration = CpuTimeStamp + IterationCounter;
RndNum = LastIteration & 3 + 1;

如果你每秒不需要很多生成的数字,这个准rnd生成器是不可预测的。

答案 2 :(得分:1)

这是一种简单的技术,可以获得一些“随机”数字(虽然它不是随机的),如果API没有提供一个

  1. 变量时间=获取系统时间
  2. 变量余数=时间%4
  3. 变量randomNumber =时间+ 1
  4. 您可以将它用于所有语言(只要您可以访问时间)。

    对于68K的高级随机数生成器,您可以看到this link

答案 3 :(得分:0)

不知道你试图在哪个系统上执行此操作,所以这是一个通用答案,应该适用,无论哪个:

query the system time, using whatever syscall / library call / api you have available
and out the top bits, leaving only the lowest 2

tadaa。 randum数字。

如果你想让它们更随机使用,也许可以这样做:

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现在应该包含您的随机数