
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.97.9.175] |
![]() |
|
Сообщ.
#1
,
|
|
|
Тут вдруг захотелось сделать генератор (псевдо)случайных чисел.
Подумал, и понял, что абсолютно не знаю (даже не представляю), КАК заставить комп выбрать случайное число, например, в промежутке от 0 до 10... Но от этого стало еще интереснее... Мож кто знает алгоритм генератора случ. чисел?.. или какие-нить мысли?.. |
![]() |
Сообщ.
#2
,
|
|
Идешь в Паскаль, в поиске набираешь "случайные числа"
|
Сообщ.
#3
,
|
|
|
"...Извините, ничего похожего не найдено..." :'(
|
Сообщ.
#4
,
|
|
|
Вот пару способов:
![]() ![]() imul ax,9421<br>inc ax ![]() ![]() in ax,40h<br>add al,ah <br>add al,Rnd<br>mov Rnd,al |
![]() |
Сообщ.
#5
,
|
|
Цитата M0l0t, 04.05.02, 18:54:37 Та нииии!"...Извините, ничего похожего не найдено..." :'( Не в форуме поиск, а на сайте паскальном! Взгляни наверх! Разделы сайта -> Pascal Вот там надо искать! |
Сообщ.
#6
,
|
|
|
![]() |
Сообщ.
#7
,
|
|
|
ideal
codeseg proc rnd dataseg @@rnd db "aaaaaaaaaaaaaaaaaa" ; длина строки ограничена моделью памяти ; и здравым смыслом :-) ; начальное значение не должно быть нулем! c=$-@@rnd @@cnt dw c @@br1 db 1h @@br2 db 1000000b codeseg lea di,[@@rnd] mov bx,[@@cnt] mov cx,[word ptr @@br1] and cl,[byte ptr @@rnd+bx-1] jz @@test and ch,[byte ptr @@rnd] jnz @@Reset jmp @@Set @@test: and ch,[byte ptr @@rnd] jz @@Reset @@Set: stc @@Reset: rcl [@@rnd+bx-1],1 rcr dx,1 dec bx rcl dx,1 jnz @@Reset @@Exit: ret endp |
Сообщ.
#8
,
|
|
|
Н-да, нас, помнится, целый семестр учили данному вопросу, вспоминаются всякие страшные слова. типа "аддитивный метод", "мультипликативный метод", метод Неймана и т.д. Но единственное, что могу щас всплмнить, из простого - берется стартовое двухзначное число, возводится в квадрат. Это - первое случайное число. Далее из него берутся две средние цифры (т.е. из 2564 - берется 56) и опять возводится в квадрат - получается второе. Получается довольно равномерное распределение, конечно, не как с теплового датчика в Пентиуме 4, но тоже ничего. Самый простой способ, IMHO.
|
Сообщ.
#9
,
|
|
|
Было бы разумно верить (но только ВЕРИТЬ, конкретных данных нет!), что наиболее качественные случайные числа из всего того, что у же есть в компе и не надо писать самому дает Win32API CryptGenRandom(), которая fills a buffer with cryptographically random bytes (MSDN). Так что если кому не хило инициализировать CryptoAPI, это наверно самый качественный источник случайных чисел в компе. Если у кого есть ссылки, насколько случайна CryptGenRandom(), буду примного благодарен!
Это не плагиат, это я сам написал в Программном форуме! А вот очень интересно - как выяснить, стоит ли в моем компе хардверный генератор случайных чисел? Я в названиях чипов ничего не понимаю... |
Сообщ.
#10
,
|
|
|
Таких алгоритмов несчетное множество, но главное чтобы они удовлетворяли двум критериям:
1. Чтобы период генератора был как можно больше. Период - это количество генераций через которое генератор начинает повторяться. 2. Чтобы при прочих равных условиях генерация всегда начиналась с одного и того же числа. Иначе проги отлаживать тяжело. |
Сообщ.
#11
,
|
|
|
Здесь я напишу свой приклад на языке Visual Basic, для World 2003, вот пример:
1.Этот код показывает чисто случайное число, и вводит в документа World случайное число от 30. Sub RandTime() Randomize Time * Rnd a1 = Int(30 * Rnd) Set o = ActiveDocument.Range o.Move Unit:=wdParagraph o.Text = " " & a1 End Sub 2.Перевести все числа в буквы. Некоторых букв нет, так как они не используются. Sub NumberTranslit Set MyRange = ActiveDocument.Content With MyRange.Find .ClearFormatting .Replacement.ClearFormatting .Text = "10" .Replacement.Text = "й" .Execute Replace:=wdReplaceAll .ClearFormatting .Replacement.ClearFormatting .Text = "11" .Replacement.Text = "к" .Execute Replace:=wdReplaceAll .ClearFormatting .Replacement.ClearFormatting .Text = "12" .Replacement.Text = "л" .Execute Replace:=wdReplaceAll .ClearFormatting .Replacement.ClearFormatting .Text = "13" .Replacement.Text = "м" .Execute Replace:=wdReplaceAll .ClearFormatting .Replacement.ClearFormatting .Text = "14" .Replacement.Text = "н" .Execute Replace:=wdReplaceAll .ClearFormatting .Replacement.ClearFormatting .Text = "15" .Replacement.Text = "о" .Execute Replace:=wdReplaceAll .ClearFormatting .Replacement.ClearFormatting .Text = "16" .Replacement.Text = "п" .Execute Replace:=wdReplaceAll .ClearFormatting .Replacement.ClearFormatting .Text = "17" .Replacement.Text = "р" .Execute Replace:=wdReplaceAll .ClearFormatting .Replacement.ClearFormatting .Text = "18" .Replacement.Text = "с" .Execute Replace:=wdReplaceAll .ClearFormatting .Replacement.ClearFormatting .Text = "19" .Replacement.Text = "т" .Execute Replace:=wdReplaceAll .ClearFormatting .Replacement.ClearFormatting .Text = "20" .Replacement.Text = "у" .Execute Replace:=wdReplaceAll .ClearFormatting .Replacement.ClearFormatting .Text = "21" .Replacement.Text = "ф" .Execute Replace:=wdReplaceAll .ClearFormatting .Replacement.ClearFormatting .Text = "22" .Replacement.Text = "х" .Execute Replace:=wdReplaceAll .ClearFormatting .Replacement.ClearFormatting .Text = "23" .Replacement.Text = "ц" .Execute Replace:=wdReplaceAll .ClearFormatting .Replacement.ClearFormatting .Text = "24" .Replacement.Text = "ч" .Execute Replace:=wdReplaceAll .ClearFormatting .Replacement.ClearFormatting .Text = "25" .Replacement.Text = "ш" .Execute Replace:=wdReplaceAll .ClearFormatting .Replacement.ClearFormatting .Text = "26" .Replacement.Text = "щ" .Execute Replace:=wdReplaceAll .ClearFormatting .Replacement.ClearFormatting .Text = "27" .Replacement.Text = "ы" .Execute Replace:=wdReplaceAll .ClearFormatting .Replacement.ClearFormatting .Text = "28" .Replacement.Text = "ь" .Execute Replace:=wdReplaceAll .ClearFormatting .Replacement.ClearFormatting .Text = "29" .Replacement.Text = "ю" .Execute Replace:=wdReplaceAll .ClearFormatting .Replacement.ClearFormatting .Text = "30" .Replacement.Text = "я" .Execute Replace:=wdReplaceAll .ClearFormatting .Replacement.ClearFormatting .Text = "0" .Replacement.Text = " " .Execute Replace:=wdReplaceAll .ClearFormatting .Replacement.ClearFormatting .Text = "1" .Replacement.Text = "а" .Execute Replace:=wdReplaceAll .ClearFormatting .Replacement.ClearFormatting .Text = "2" .Replacement.Text = "б" .Execute Replace:=wdReplaceAll .ClearFormatting .Replacement.ClearFormatting .Text = "3" .Replacement.Text = "в" .Execute Replace:=wdReplaceAll .ClearFormatting .Replacement.ClearFormatting .Text = "4" .Replacement.Text = "г" .Execute Replace:=wdReplaceAll .ClearFormatting .Replacement.ClearFormatting .Text = "5" .Replacement.Text = "д" .Execute Replace:=wdReplaceAll .ClearFormatting .Replacement.ClearFormatting .Text = "6" .Replacement.Text = "е" .Execute Replace:=wdReplaceAll .ClearFormatting .Replacement.ClearFormatting .Text = "7" .Replacement.Text = "ж" .Execute Replace:=wdReplaceAll .ClearFormatting .Replacement.ClearFormatting .Text = "8" .Replacement.Text = "з" .Execute Replace:=wdReplaceAll .ClearFormatting .Replacement.ClearFormatting .Text = "9" .Replacement.Text = "и" .Execute Replace:=wdReplaceAll .ClearFormatting .Replacement.ClearFormatting .Text = " " .Replacement.Text = "" .Execute Replace:=wdReplaceAll End With End Sub 4.Все это вкидаем в этот код. Sub PatchOfRandTime RandTime RandTime RandTime 'Можна и больше RandTime NumberTranslit End PatchOfRandTime |
Сообщ.
#12
,
|
|
|
Дональд Кнут. Искусство программирования. Том 2
Там целая глава на эту тему |
Сообщ.
#13
,
|
|
|
Вот даю ссылку, здесь в архиве есть шаблон для документа World 2003, скачайте Генератор Пророчеств.
|