Как посеять для генерации случайных чисел?

Он не генерирует предполагаемую случайность.

Я думал, начиная с семени, как $ 66 и xoring два последних младших бит, и ROR даст мне следующее случайное число и так далее, но он показывает только $ B3 и не меняется вообще.

Как я должен питаться? Строка выше случайного отображает номер на portc, поскольку я хочу, чтобы два числа отображались друг за другом.

Я использую avr studio 4 для atmega 8535 в 1 МГц.

> ;Program to random numbers on port C > > ;Stack and Stack Pointer Addresses .equ SPH =$3E > ;High Byte Stack Pointer Address .equ SPL =$3D > ;Low Byte Stack Pointer Address > > .equ RAMEND =$25F ;Stack Address > > ;Port Addresses > > .equ PORTC =$15 ;Port C Output Address > > .equ DDRC =$14 ;Port C Data Direction Register > Address > > .equ numberoneddr=DDRC > > .equ numberoneport=portc > > .equ numbertwoddr=DDRC > > .equ numbertwoport=portc > > .equ delayCount=21 > > .equ random1 =$66 > > ;Register Definitions > > .def numberone =r1 ;Register to store data pointed > to by Z > > .def numbertwo =r2 > > .def temp =r16 ;Temporary storage register > > > > reset: > > ; initialize stack pointer. Done automatically at reset on many AVRs > > ldi temp, low (RAMEND) > > out spl, temp > > ldi temp, high (RAMEND) > > out sph, temp > > > > > ;port initialisation > > ldi temp,$FF > > out numberoneddr,temp > > out numberoneport,temp > > out numbertwoddr,temp > > out numbertwoport,temp > > > > ;Program Initialisation > > ldi temp,$66 > > rcall random > > mov numberone, temp > > out numberoneport,numberone > > rcall random > > mov numbertwo, temp > > out numberoneport,numbertwo > > > > > random: mov r19,temp > > ldi r17, 0x01 > > eor r19,r17 > > ror r19 > > mov temp,r19 > > ret > > > > delay: > clr r20 > > clr r21 > > ldi r22, delayCount > > loopDelay: > > dec r20 > > brne loopDelay > > dec r21 > > brne loopDelay > > dec r22 > > brne loopDelay > > ret 

После некоторого поиска в архивах исходного кода древнего asm я нашел это для платформы x86 MSDOS NASM, которую я использовал в те дни:

 ;.rnd ;al=rnd num <0,ah>; .rnd: pusha mov cx,ax .rnd0: mov bx,[cs:.rnddat] mov ax,[cs:.rndtim] xor al,bh add ah,bh rcr ax,3 xor al,bl rcl ax,2 .rnd2: cmp al,ch jbe .rnde sub al,ch or ch,ch jnz .rnd2 sub al,al .rnde: mov ah,bl mov [cs:.rnddat],ax or al,1 xor ax,[fs:046Ch] add [cs:.rndtim],ax popa mov al,[cs:.rnddat] ret .rnddat:db 0,0 .rndtim:dw 0 

Идея состоит в том, чтобы некоторые сохраненные числа выполняли некоторые базовые операции ALU, такие как +,*,/,<<,>>,&,^ но гарантировали, что насыщенность не происходит и обычно заменяет H,L некоторого значения, чтобы сохранить случайность в проверить. Поэтому переносите это в свой asm, но я настоятельно рекомендую его закодировать и сначала попробовать на ПК, чтобы узнать, насколько случайность в порядке для вашей задачи.

BTW вы можете использовать также память программы или любое содержимое ПЗУ в качестве базы для случайности … это также использует внутренний блок RTC, поэтому вы должны опустить эту часть или добавить таймер или просто зациклиться на кучу непустых данных.

 [0000:046C] are 4 Bytes master clock count (long integer) 0 = midnight and increments until a 24 hour equiv. 

Я нашел еще более старую демо-версию под названием NoSignal (с 1997 года в TASM), в которой есть:

  .386P IDEAL MODEL TINY CODESEG STARTUPCODE main: mov ax,19 ;320*200*256 int 16 push 0A000h ;Video segment pop es ;keyboard test,speaker delay v si=256 l0: ror ax,cl ;rnd...ax add ax,di stosw ;plot... loop r1 ;speaker delay... mov cx,si out 61h,al r1: or di,di jnz l0 push ax mov ah,1 ;test keyboard int 16h pop ax jz l0 ende: sub ax,ax ;turn off speaker and exit out 61h,al int 16h mov ax,3 int 16 ret END 

Он заполняет экран и динамик белым шумом, как будто антенный кабель в аналоговом телевизоре отсутствует. Эта версия длиной 44 байта, псевдослучайный генератор начинается с метки l0:

  • ax – это сгенерированное число (а также превалирующее сгенерированное число, например, temp)
  • di увеличивается (что-то вроде фактического времени) …
  • cl уменьшается

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

  rnd:ror ax,cl ;rnd...ax add ax,di inc di dec cl ret 

и добавьте push/pop сохранить регистры / значения, если это необходимо. Если вам нужно что-то более сложное, используйте modulo prime arithmetics.

[edit1] простой C ++ псевдослучайный генератор

 WORD rnd_d0=0x66; // these are seed numbers if not selected right then the randomness is not good WORD rnd_d1=0x5A; // these give fairly good results WORD rnd_d2=0xC3; WORD rnd() { rnd_d0^=rnd_d1|rnd_d2; // xor rnd_d1*=rnd_d2; // mul rnd_d2+=rnd_d1; // add rnd_d0=(rnd_d0<<8)|(rnd_d0>>8); // 8bit halves swap return rnd_d0; } 

Вышеуказанные случайные генераторы были сжаты до времени среды DOS или специального использования. Это не так … случайность такова:

график случайности

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

Нет сигнала

и здесь Gif анимация:

NoSignal 320x240x3

Код заполнения NoSignal выглядит следующим образом:

  for (int y=0;y>8); 

Таким образом, просто высокий 8bit из 16bit битного псевдослучайного числа используется умножение, которое просто преобразует это 8bit число в серый цвет.

  • xs,ys – размер изображения
  • pyx – прямой указатель изображения на его строки

Не меняйте номера семян без надлежащего тестирования с помощью этого на ПК

Неправильно выбранные семена вообще не приводят к случайности. Если вы хотите безопасно семена (без тестирования), то семя с предоставленными константами, а затем вызовите rnd() столько же раз, сколько и ваш новый номер семени. Busted это прямо сейчас, так что для этого могут быть лучшие семена, это только первые, которые я нашел, что дает неплохие результаты

Эти семена также хороши:

  WORD rnd_d0=0x37A6; WORD rnd_d1=0x377A; WORD rnd_d2=0x3BC3; 
Interesting Posts

Java: как проверить, находится ли дата в определенном диапазоне?

Не удается установить refind на Mac OS Sierra

Использование scanf () в программах на C ++ быстрее, чем использование cin?

Должен ли я отформатировать USB-накопители и SD-карты в FAT, FAT32, exFAT или NTFS? (Файлы Windows, живые Linux-искатели)

Использование нескольких версий одной и той же библиотеки DLL

Не удалось подключиться к идентификатору процесса Xcode

Удалить «” из значений csv и изменить имена столбцов при записи в CSV

ASP.NET MVC – Объединить результат Json с ViewResult

Поиск неиспользуемых банок, используемых в проекте eclipse

Тестирование нуля в Objective-C – if (x! = Nil) vs if (x)

как изменить исходный IP-адрес в HttpWebRequest

Изменение макета слайдов по умолчанию в Powerpoint

Как обращаться с кнопкой «Назад» в диалоговом окне?

При установке Windows 7 появляется ошибка 5 CDBOOT: Невозможно загрузить с компакт-диска; Зачем?

Изменение цен на товары через крючок в WooCommerce 3

Давайте будем гением компьютера.