views:

206

answers:

4

How to generate random numbers using assembly code in the range 1--4 ?

+3  A: 

1 + (rand() % 4), in general (where rand() is a decent random integer generator).

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

You could go read up on say Mersenne Twister, for how to implement rand(), but it's pretty complex.

Simon Buchan
A: 

Don't know what system you are trying to do this on, so here is a general answer, that should apply, no matter which:

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 numbers.

if you want them more random use perhaps do this instead:

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

Cheers!

/B2S

EDIT: Sorry, been on holiday out of internet's reach. (yes, genuinely amazing that such places still exist) I'm not particularly familiar with either EyeBot nor 68k asm. So I don't know the syscall to read in the clock or time (either will do). So look that one up, the rest of the code should be something like


//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 should now contain your random number

Born2Smile
What will be the code?loop: MOVE.L D0MOVE.L D0%4, D1ADD.L #1, D1CMP.L D1<4MOVE.L D1, D2JMP loop................?? correct?
banik0191
A: 

You can do own quasi random number generator. If you have access to the RTC (real clock counter) or CPU time stamp than you can do rutine relatively simple.

Very simple example:

Int LastIteration;
Int IterationCounter;

...


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

This quasi rnd generator is enough unpredictable if you don't need a lot of generated numbers per second.

GJ
A: 

This is a simple technique to get somewhat a "random" number (it's not really random though), if the API doesn't provide one

  1. variable time = get the system time
  2. variable remainder = time % 4
  3. variable randomNumber = time + 1

You can use this with every language (provided that you can access the time).

For an advanced random number generator in 68K, you can see this link.

phunehehe