генерация случайных чисел - PullRequest
1 голос
/ 31 марта 2010

Как генерировать случайные числа, используя ассемблерный код в диапазоне 1--4?

Ответы [ 4 ]

3 голосов
/ 31 марта 2010

1 + (rand ()% 4), в общем (где rand () - достойный случайный целочисленный генератор).

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

Вы можете прочитать, скажем, Mersenne Twister , о том, как реализовать rand (), но это довольно сложно.

1 голос
/ 31 марта 2010

Это простой метод, позволяющий получить «случайное» число (хотя на самом деле оно не случайное), если API не предоставляет

  1. переменное время = получить системное время
  2. Переменная остаток = время% 4
  3. переменная randomNumber = время + 1

Вы можете использовать это с любым языком (при условии, что у вас есть доступ ко времени).

Для расширенного генератора случайных чисел в 68K, вы можете увидеть эту ссылку .

1 голос
/ 31 марта 2010

Вы можете создать собственный квази генератор случайных чисел. Если у вас есть доступ к RTC (счетчику реальных часов) или метке времени процессора, тогда вы можете сделать процедуру относительно простой.

Очень простой пример:

Int LastIteration;
Int IterationCounter;

...


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

Этот квази-генератор достаточно непредсказуем, если вам не нужно много генерируемых чисел в секунду.

0 голосов
/ 31 марта 2010

Не знаю, на какой системе вы пытаетесь это сделать, поэтому вот общий ответ, который должен применяться, независимо от того, какая:

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

tadaa. номера рандов.

если вы хотите, чтобы они использовались более случайно, возможно, сделайте это вместо:

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 +1011 *

РЕДАКТИРОВАТЬ: Извините, был в отпуске вне досягаемости Интернета. (да, действительно удивительно, что такие места все еще существуют) Я не особенно знаком ни с 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 теперь должен содержать ваше случайное число

...