User Tag List

Страница 5 из 6 ПерваяПервая 123456 ПоследняяПоследняя
Показано с 41 по 50 из 51

Тема: Генератор псевдослучайных чисел

  1. #41

    Регистрация
    25.03.2013
    Адрес
    г. Лондон, Великобритания
    Сообщений
    948
    Спасибо Благодарностей отдано 
    9
    Спасибо Благодарностей получено 
    4
    Поблагодарили
    4 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от denpopov Посмотреть сообщение
    собственно нет. мне процедура досталась давным-давно и найдена неизвестно где.
    Но я не утверждаю, что генератор хорош
    Чисто проговорю чтобы можно было понять со стороны: в этом конкретном тесте, найденная незнамо где процедура работает лучше 66т генератора.

    ---------- Post added at 17:49 ---------- Previous post was at 17:37 ----------

    ...но если бы ты замешал биты, как я показывал вот здесь: http://forum.tslabs.info/viewtopic.php?f=3&t=391 , или взял бы не первый, а второй генератор оттуда же, даже без замешивания, то получилось бы по крайней мере не хуже и всё ещё быстрее.
    "introspec" читается как "интроспек". некоторые читают как "интроспец", но я никакой не спец. я спек.

  2. #42

    Регистрация
    12.02.2014
    Адрес
    г. Арзамас
    Сообщений
    6,123
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    3
    Поблагодарили
    3 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    кстати, такой вопрос - как получить случайное число из диапазона, например random(60)?

    ничего другого в голову не пришло, как int(rnd()/255*60)

  3. #43

    Регистрация
    25.01.2005
    Адрес
    Miass, Chelyabinsk region
    Сообщений
    4,094
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    2
    Поблагодарили
    2 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    можно rnd()%60

  4. #44

    Регистрация
    08.05.2007
    Адрес
    Dnepropetrovsk
    Сообщений
    1,089
    Спасибо Благодарностей отдано 
    281
    Спасибо Благодарностей получено 
    70
    Поблагодарили
    49 сообщений
    Mentioned
    3 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от denpopov Посмотреть сообщение
    ничего другого в голову не пришло, как int(rnd()/255*60)
    Все правильно. Только зачем делить на 255? Это нужно, только если исходные случайные числа находятся в диапазоне 0..255.

    Остаток от деления и (что равносильно) выделение младших бит не рекомендуется делать в тех книгах, которые я читал о генераторах случайных чисел. Обычно "качество" старших бит в генераторах лучше.

  5. #45

    Регистрация
    12.02.2014
    Адрес
    г. Арзамас
    Сообщений
    6,123
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    3
    Поблагодарили
    3 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Barmaley_m Посмотреть сообщение
    Только зачем делить на 255? Это нужно, только если исходные случайные числа находятся в диапазоне 0..255.
    потому что под rnd() я имел в виду ту функцию, которая выдает случайное число.

  6. #46

    Регистрация
    11.04.2006
    Адрес
    Novosibirsk
    Сообщений
    971
    Спасибо Благодарностей отдано 
    4
    Спасибо Благодарностей получено 
    11
    Поблагодарили
    9 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от denpopov Посмотреть сообщение
    потому что под rnd() я имел в виду ту функцию, которая выдает случайное число.
    Брать остаток от деления, делить нацело, либо пользовать какой-то иной фрагмент от значения ГСЧ верно только в случае когда ГСЧ является именно ГСЧ (и то сильно не всегда).

    Если оперировать цифровым ГПСЧ, то можно наступить на реальные грабли, и тут уже "какой кусочек брать если меня разрядность не устраивает" играет очень заметную роль.

    В большинстве случаев либо делят нацело и берут остаток от деления, либо просто делят нацело (применительно к z80 исключительно дорогая в плане машинного времени процедура если не по степени двойки). Если разрядность позволяет - маскируют. Но тут нужно читать классиков, потому-что бездумное применение конкретных метод для конкретных генераторов ПСЧ может дать откровенно плохой выхлоп.

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

  7. #46
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  8. #47

    Регистрация
    12.02.2014
    Адрес
    г. Арзамас
    Сообщений
    6,123
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    3
    Поблагодарили
    3 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от ram_scan Посмотреть сообщение
    "какой кусочек брать если меня разрядность не устраивает
    честно говоря, для меня это темный лес.
    просто возникла такая необходимость в вычислении случайных чисел из диапазона.

  9. #48

    Регистрация
    11.04.2006
    Адрес
    Novosibirsk
    Сообщений
    971
    Спасибо Благодарностей отдано 
    4
    Спасибо Благодарностей получено 
    11
    Поблагодарили
    9 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от denpopov Посмотреть сообщение
    честно говоря, для меня это темный лес.
    просто возникла такая необходимость в вычислении случайных чисел из диапазона.
    Если по степени двойки можно замаскировать старшие биты. Если не по степени двойки - поделить нацело или взять остаток от деления нацело.

    Но качество результата очень сильно зависит от того как устроен генератор ПСЧ.

    Никто не говорит что так нельзя делать. Так иногда нельзя делать. Если вас результат устраивает (вряд-ли вы пишете криптостойкую софтину, да и генераторы тут опубликованные не для таковой) то пользуйтесь на здоровье и не грейте себе голову =) Перфекционизм - не всегда хорошо.

  10. #49

    Регистрация
    12.02.2014
    Адрес
    г. Арзамас
    Сообщений
    6,123
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    3
    Поблагодарили
    3 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    еще из раскопок, слишком много на винте скачанного файла. Субботник!
    Код:
    ; Fast RND
    ;
    ; An 8-bit pseudo-random number generator,
    ; using a similar method to the Spectrum ROM,
    ; - without the overhead of the Spectrum ROM.
    ;
    ; R = random number seed
    ; an integer in the range [1, 256]
    ;
    ; R -> (33*R) mod 257
    ;
    ; S = R - 1
    ; an 8-bit unsigned integer
    
     ld a, (seed)
     ld b, a 
    
     rrca ; multiply by 32
     rrca
     rrca
     xor 0x1f
    
     add a, b
     sbc a, 255 ; carry
    
     ld (seed), a
     ret

  11. #50

    Регистрация
    02.02.2005
    Адрес
    Saint-Petersburg
    Сообщений
    217
    Спасибо Благодарностей отдано 
    125
    Спасибо Благодарностей получено 
    48
    Поблагодарили
    30 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Сижу с генераторами ПСЧ8 для Вектор-06Ц.
    Написалось три генератора, все 3 - отстой и работают кое-как, но делюсь.
    Если у кого-то есть лучше - дайте знать.

    Код:
    ; random_xorshift
    ; вход:  E - верхняя граница
    ; выход: A - псевдослучайное число [0, E]
    RND8:	push h
    	push d
    	lhld SEED ; Загружаем состояние
    	; XOR-shift алгоритм
    	mov a, h
    	rrc         ; Сдвиг вправо
    	mov h, a
    	mov a, l
    	rlc         ; Сдвиг влево
    	mov l, a
    	xra h       ; XOR между H и L
    	mov h, a
    	shld SEED ; Сохраняем новое состояние
    	mov a, l ; Берем случайное число
    	cmp e ; Ограничиваем диапазоном [0, E]
    	jc RDONE
    MLX:    sub e
    	cmp e
    	jnc MLX
    RDONE:  pop d
    	pop h
    	ret
    
    SEED:   db  13h
    Код:
    ; RND Дениса Попова переводим на 8080, вариант №1
    ; вход:  E - верхняя граница
    ; выход: A - псевдослучайное число [0, E]
    RND8:	lda SEED
    	mov B,A
    	stc      ; rrca 1
    	cma
    	rar
    	cma
    	stc      ; rrca 2
    	cma
    	rar
    	cma
    	stc      ; rrca 3
    	cma
    	rar
    	cma
    	xri 0x1f ; A=A xor 0x1f
    	add B    ; A=A+B
    	sbi 255  ; A=A-255-CY
    	sta SEED
    	cmp E
    	jnc RND8 ; если >= E, генерим по новой
    	ret
    
    SEED:   db  13h
    Код:
    ; RND Дениса Попова переводим на 8080, вариант №2
    ; вход:  E - верхняя граница
    ; выход: A - псевдослучайное число [0, E]
    RND8:	lda SEED
    	mov B,A
    	rar     ; rrca 1
    	jnc RR2
    	ori 80h
    RR2:	rar     ; rrca 2
    	jnc RR3
    	ori 80h
    RR3:	rar     ; rrca 3
    	jnc RR4
    	ori 80h
    RR4:    xri 0x1f
            add b
    	sbi 255 ; приплыли
     	sta SEED
    	cmp E
    	jnc RND8 ; если >= E, генерим по новой
    	ret
    
    SEED:   db  13h
    - - - Добавлено - - -

    Есть ещё инновационный подход.
    1) Пишем за минуту программу на питоне
    2) Генерируем нужное нам кол-во псевдослучайных чисел в нужном диапазоне
    3) Загоняем в таблицу
    4) По этой таблице и ходим в своей программе, чтобы не иметь себе мозг. Enjoy

Страница 5 из 6 ПерваяПервая 123456 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Расчет модуля разности чисел
    от Andrew771 в разделе Программирование
    Ответов: 15
    Последнее: 15.02.2013, 21:06
  2. Ответов: 16
    Последнее: 15.12.2011, 20:29
  3. Генератор RND
    от Destr в разделе Программирование
    Ответов: 4
    Последнее: 19.10.2009, 21:16
  4. генератор тора
    от voodoogod в разделе Программирование
    Ответов: 1
    Последнее: 10.03.2005, 20:19

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •