2010-03-31 6 views
1

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

+0

это будет отличаться для каждой архитектуры, на которую вы хотите настроить таргетинг. Вы используете ARM? x86? –

+0

Я использую для EyeBot и нуждаюсь в кодировании для дальнейшей работы – 2010-03-31 04:35:44

+0

EyeBot, по-видимому, использует процессор 68000 - я добавил соответствующий тег, чтобы помочь вам получить ответ на конкретный процессор. –

ответ

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. рядовые числа.

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

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

EDIT: К сожалению, был в отпуске вне досягаемости Интернета. (да, поистине удивительно, что такие места все еще существуют). Я не особенно знаком ни с EyeBot, ни с 68-килограммовым ассом. Поэтому я не знаю, как syscall считывать часы или время (либо будет делать). Так что смотрите, что один вверх, остальная часть кода должна быть что-то вроде


//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 должны теперь содержать ваш случайное число

+0

Какой будет код? петля: MOVE.L D0 MOVE.L D0% 4, D1 ADD.L # 1, D1 CMP.L D1 <4 MOVE.L D1, D2 JMP loop ........... ..... ?? верный? – 2010-03-31 04:28:00

3

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

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

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

1

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

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

Int LastIteration; 
Int IterationCounter; 

... 


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

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

1

Это простой метод, чтобы получить несколько «случайное» число (это не совсем случайные, хотя), если API не предоставляет один

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

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

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