OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 28 Март, 2024 15:48

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 12 ] 
Автор Сообщение
СообщениеДобавлено: Суббота, 21 Октябрь, 2017 13:53 

Зарегистрирован: Воскресенье, 06 Август, 2017 19:33
Сообщения: 79
Как генерировать случайные числа?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 21 Октябрь, 2017 14:58 

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 1447
Откуда: Киев
Генерировать случайные числа нужно специальными физическими устройствами. Псевдослучайные можно алгоритмически. Но в первую очередь нужно знать, зачем эти числа нужны. Тогда ответ может быть точней.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 21 Октябрь, 2017 15:10 

Зарегистрирован: Воскресенье, 06 Август, 2017 19:33
Сообщения: 79
Comdiv писал(а):
Генерировать случайные числа нужно специальными физическими устройствами.

А разве такое устройство не встроено в каждый современный компьютер?
Comdiv писал(а):
Но в первую очередь нужно знать, зачем эти числа нужны. Тогда ответ может быть точней.

Я собираюсь написать программу сортировки. Для неё нужно сгенерировать массив чисел.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 21 Октябрь, 2017 15:16 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2662
Откуда: Россия, Ярославль
Можете воспользоваться модулем ypkMathRandom из компонента ypk http://oberoncore.ru/bbcc/subs/ypk/start


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 21 Октябрь, 2017 15:42 

Зарегистрирован: Пятница, 13 Март, 2009 16:36
Сообщения: 987
Откуда: Казань
Я обычно пользуюсь таким кодом:
Код:
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.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 21 Октябрь, 2017 15:58 

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 1447
Откуда: Киев
Александр К писал(а):
Comdiv писал(а):
Генерировать случайные числа нужно специальными физическими устройствами.
А разве такое устройство не встроено в каждый современный компьютер?
Нет, но персональные компьютеры оснащены устройствами, от которых в качестве побочных эффектов можно получить небольшое количество случайных чисел, комбинируя которые с генераторами псевдослучайных чисел можно получить поток чисел, почти всегда достаточно хороший для задач криптографии. Почти.
Александр К писал(а):
Я собираюсь написать программу сортировки. Для неё нужно сгенерировать массив чисел.
Для этой задачи полностью подходит простейший линейный конгруэнтный метод, который привёл Рифат. Можно и без WinApi. Плохо то, что допускается арифметическое переполнение, но в BlackBox это будет работать.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 21 Октябрь, 2017 16:22 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
Для простых задач обычно достаточно ObxRandom.

Наиболее разнообразная реализация генераторов опубликована у Хельмута.
http://www.zinnamturm.eu/downloadsOS.htm#Rng


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 21 Октябрь, 2017 17:17 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2662
Откуда: Россия, Ярославль
Obx это же не библиотечные модули, это модули с примерами. Зачем такое рекомендовать?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 21 Октябрь, 2017 17:30 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Из лекций:

Цитата:
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 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
Александр К писал(а):
Я собираюсь написать программу сортировки. Для неё нужно сгенерировать массив чисел.

Для такой задачи ObxRandom достаточно.

Только надо инициализировать.
Код:
ObxRandom.InitSeed(SHORT(Kernel.Time()))


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 21 Октябрь, 2017 17:51 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
Пётр Кушнир писал(а):
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 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2662
Откуда: Россия, Ярославль
Дело не в том, что код совпадает, а в том, что Obx это набор примеров.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 12 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5


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

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB