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/