OberonCore https://forum.oberoncore.ru/ |
|
Как генерировать случайные числа? https://forum.oberoncore.ru/viewtopic.php?f=35&t=6142 |
Страница 1 из 1 |
Автор: | Александр К [ Суббота, 21 Октябрь, 2017 13:53 ] |
Заголовок сообщения: | Как генерировать случайные числа? |
Как генерировать случайные числа? |
Автор: | Comdiv [ Суббота, 21 Октябрь, 2017 14:58 ] |
Заголовок сообщения: | Re: Как генерировать случайные числа? |
Генерировать случайные числа нужно специальными физическими устройствами. Псевдослучайные можно алгоритмически. Но в первую очередь нужно знать, зачем эти числа нужны. Тогда ответ может быть точней. |
Автор: | Александр К [ Суббота, 21 Октябрь, 2017 15:10 ] |
Заголовок сообщения: | Re: Как генерировать случайные числа? |
Comdiv писал(а): Генерировать случайные числа нужно специальными физическими устройствами. А разве такое устройство не встроено в каждый современный компьютер? Comdiv писал(а): Но в первую очередь нужно знать, зачем эти числа нужны. Тогда ответ может быть точней. Я собираюсь написать программу сортировки. Для неё нужно сгенерировать массив чисел. |
Автор: | Пётр Кушнир [ Суббота, 21 Октябрь, 2017 15:16 ] |
Заголовок сообщения: | Re: Как генерировать случайные числа? |
Можете воспользоваться модулем ypkMathRandom из компонента ypk http://oberoncore.ru/bbcc/subs/ypk/start |
Автор: | Rifat [ Суббота, 21 Октябрь, 2017 15:42 ] |
Заголовок сообщения: | Re: Как генерировать случайные числа? |
Я обычно пользуюсь таким кодом: Код: MODULE MathRand;
IMPORT WinApi; CONST a = 1664525; c = 1013904223; VAR seed: INTEGER; PROCEDURE Rand*(): INTEGER; BEGIN seed := a * seed + c; RETURN seed END Rand; PROCEDURE Randomize*; BEGIN seed := WinApi.GetTickCount(); END Randomize; BEGIN seed := 0; END MathRand. |
Автор: | Comdiv [ Суббота, 21 Октябрь, 2017 15:58 ] |
Заголовок сообщения: | Re: Как генерировать случайные числа? |
Александр К писал(а): Comdiv писал(а): Генерировать случайные числа нужно специальными физическими устройствами. А разве такое устройство не встроено в каждый современный компьютер?Александр К писал(а): Я собираюсь написать программу сортировки. Для неё нужно сгенерировать массив чисел. Для этой задачи полностью подходит простейший линейный конгруэнтный метод, который привёл Рифат. Можно и без WinApi. Плохо то, что допускается арифметическое переполнение, но в BlackBox это будет работать.
|
Автор: | Иван Денисов [ Суббота, 21 Октябрь, 2017 16:22 ] |
Заголовок сообщения: | Re: Как генерировать случайные числа? |
Для простых задач обычно достаточно ObxRandom. Наиболее разнообразная реализация генераторов опубликована у Хельмута. http://www.zinnamturm.eu/downloadsOS.htm#Rng |
Автор: | Пётр Кушнир [ Суббота, 21 Октябрь, 2017 17:17 ] |
Заголовок сообщения: | Re: Как генерировать случайные числа? |
Obx это же не библиотечные модули, это модули с примерами. Зачем такое рекомендовать? |
Автор: | Info21 [ Суббота, 21 Октябрь, 2017 17:30 ] |
Заголовок сообщения: | Re: Как генерировать случайные числа? |
Из лекций: Цитата: 2 О псевдослучайных числах
Генераторы псевдослуч. числе -- вещь крайне коварная (великий Джон фон Нейман лажанулся в самом первом своем -- не сумел (!) подойти "математически" (!), занимался рукосуйством). А. Качество "случайности" (главный спец: George Marsaglia; серия тестов "Diehard") Б. Длина периода. Касательно того, что выше, из письма (2004): Цитата: ......... 2 - Very many 'Platform supplied' random number generators are rubbish. 3 - BlackBox does provide one (as an example) in ObxRandom. It is due to Lewis, Goodman, & Miller, and is widely cited. It has a small (31 bit) state vector which, in my opinion, makes it marginal for large simulations, and inadequate for very large simulations. It is better that many, and among the best of its type. For performance details refer to Donald Knuth, The Art of Computer Programming, Volume 2, Table 1, page 106, line 19. He describes it as 'adeguate but less outstanding', and '... have known defects'. 4 - There are two other random number generators in module LibRandom (available from CPC). These are recommended by Knuth, have large state vectors (upto over 6000 bits), some good proven properties (eg virtually infinite cycle length), have passed many empirical tests, and are widely available (any platform with either c or FORTRAN). ... Robert Campbell |
Автор: | Иван Денисов [ Суббота, 21 Октябрь, 2017 17:41 ] |
Заголовок сообщения: | Re: Как генерировать случайные числа? |
Александр К писал(а): Я собираюсь написать программу сортировки. Для неё нужно сгенерировать массив чисел. Для такой задачи ObxRandom достаточно. Только надо инициализировать. Код: ObxRandom.InitSeed(SHORT(Kernel.Time()))
|
Автор: | Иван Денисов [ Суббота, 21 Октябрь, 2017 17:51 ] |
Заголовок сообщения: | Re: Как генерировать случайные числа? |
Пётр Кушнир писал(а): Obx это же не библиотечные модули, это модули с примерами. Зачем такое рекомендовать? Так твой модуль и не отличается от ObxRandom алгоритмом. Вот твой код: Код: VAR seed: INTEGER; PROCEDURE UniRandReal* (): REAL; CONST a = 16807; m = 2147483647; q = m DIV a; r = m MOD a; BEGIN seed := a * (seed MOD q) - r * (seed DIV q); IF seed <= 0 THEN seed := seed + m END; RETURN seed * (1.0 / m) END UniRandReal; Вот ObxRandom: Код: VAR z: INTEGER; (* global variable *) PROCEDURE Uniform* (): REAL; CONST a = 16807; m = 2147483647; q = m DIV a; r = m MOD a; VAR gamma: INTEGER; BEGIN gamma := a * (z MOD q) - r * (z DIV q); IF gamma > 0 THEN z := gamma ELSE z := gamma + m END; RETURN z * (1.0 / m) (* value of the function *) END Uniform; Для новичка проще использовать то, что есть "из коробки". Хотя с установкой расширений всё равно придется разобраться рано или поздно. |
Автор: | Пётр Кушнир [ Суббота, 21 Октябрь, 2017 18:33 ] |
Заголовок сообщения: | Re: Как генерировать случайные числа? |
Дело не в том, что код совпадает, а в том, что Obx это набор примеров. |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |