Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.02.2019, 02:28   #1
Ghaydn
 
Регистрация: 20.03.2018
Сообщений: 7
По умолчанию srand (нубский вопрос)

Итак, приветствую всех.
Возможно, вопрос действительно нубский, но всё же. Имеем код вида:
Код:
srand(SomeConst);
//...
int A = rand ();
int B = rand ();
//...
int Z = rand ();
Если в качестве SomeConst я буду всякий раз ставить одно и то же зерно, буду ли я получать при каждом запуске одни и те же значения A, B и Z? Если нет, то как добиться повторяемости и, желательно, кроссплатформенной?
Погуглил, обычно все решают противоположную задачу: искореняют повторяемость всеми силами. Мне же надо добиться, с одной стороны, более-менее нормального распределения, а с другой - чтобы программа вела себя абсолютно одинаково при каждом запуске, желательно и на разных машинах.
— Доктор, меня не понимают...
— вРН БШ ЯЙЮГЮКХ?
Ghaydn вне форума Ответить с цитированием
Старый 26.02.2019, 09:32   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Цитата:
Мне же надо добиться, с одной стороны, более-менее нормального распределения,
и сколько же чисел вы желаете КАЖДЫЙ раз получать ? 5, 100, 1000, ... ?
в таких пределах разумно ПОЛУЧИТЬ оное количество заранее (и ОДИН раз) и "запомнить" их в каком либо программном константном массиве.(файле\ресурсе\и т.д.)
Цитата:
программа вела себя абсолютно одинаково при каждом запуске
а может вам нужна уже посчитанная "статистика" для ЭТОЙ последовательности ?
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 26.02.2019, 10:22   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
и сколько же чисел вы желаете КАЖДЫЙ раз получать ? 5, 100, 1000, ... ?
в таких пределах разумно ПОЛУЧИТЬ оное количество заранее (и ОДИН раз) и "запомнить" их в каком либо программном константном массиве.(файле\ресурсе\и т.д.)
я бы тоже предложил именно такой вариант. Получить нужную (с требуемыми характеристиками) псевдослучайную последовательность один раз и запомнить.
потом брать её из сохранённого ресурса.

есть ещё один вариант.
есть формулы для получения ПСЧ. Можно написать реализацию одной из формул в свою функцию mysrand(). Теоретически, вычисляемый ряд будет одинаков на любой платформе.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 26.02.2019, 10:56   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Главное, чтобы в это формуле не подмешивался таймер или иной внешний шум для большей "случайности".

А вообще стоит огласить решаемую задачу. Например, для связи широко используют синхронизацию и подстройку ГСПЧ.
p51x на форуме Ответить с цитированием
Старый 26.02.2019, 15:57   #5
Ghaydn
 
Регистрация: 20.03.2018
Сообщений: 7
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
и сколько же чисел вы желаете КАЖДЫЙ раз получать ? 5, 100, 1000, ... ?
А вот кто б знал... Во всяком случае, последовательность нужна достаточно длинная, чтобы считать её по формуле, а не записать константой раз и навсегда.

Цитата:
Сообщение от p51x Посмотреть сообщение
А вообще стоит огласить решаемую задачу.
Я пишу (почти дописал альфу) симулятор живых клеток, вдохновлённый "КиберБиологией". Каждый цикл из сотен в секунду у каждого из десятков тысяч ботов может произойти случайный выбор; мутации, опять же, случайны. Последовательность ПСЧ должна быть длинной и равномерной, чтобы боты не смогли к ней адаптироваться. Контролируемость же нужна, чтобы можно было подробно рассмотреть какие-то отдельные интересные события или даже проследить всю цепочку мутаций, приведшую к той или иной форме.
— Доктор, меня не понимают...
— вРН БШ ЯЙЮГЮКХ?

Последний раз редактировалось Ghaydn; 26.02.2019 в 15:59. Причина: Какая-то ерунда с кодировкой из-за перелогина случилась.
Ghaydn вне форума Ответить с цитированием
Старый 26.02.2019, 17:20   #6
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Ghaydn Посмотреть сообщение
Я пишу (почти дописал альфу) симулятор живых клеток, вдохновлённый "КиберБиологией".
тогда я, пожалуй, даже поделюсь с вами формулой:
(сам же я, не мудорствуя лукаво, стырил её у Кнута)

Код:
     static int RND() 
     { 
         static int seed = GetTick();
         return ( ((seed = seed * 214013L + 2531011L ) >> 16)& 0x7fff);
     }
_Bers вне форума Ответить с цитированием
Старый 26.02.2019, 17:21   #7
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от _Bers Посмотреть сообщение
тогда я, пожалуй, даже поделюсь с вами формулой:
(сам же я, не мудорствуя лукаво, стырил её у Кнута)

Код:
     static int RND() 
     { 
         static int seed = GetTick();
         return ( ((seed = seed * 214013L + 2531011L ) >> 16)& 0x7fff);
     }
GetTick(); - количество тиков процессора с начала эпохи.
В вашем случае у вас должно быть какое то фиксированное число.
_Bers вне форума Ответить с цитированием
Старый 26.02.2019, 23:59   #8
Ghaydn
 
Регистрация: 20.03.2018
Сообщений: 7
По умолчанию

Цитата:
Сообщение от _Bers Посмотреть сообщение
тогда я, пожалуй, даже поделюсь с вами формулой:
(сам же я, не мудорствуя лукаво, стырил её у Кнута)

Код:
     static int RND() 
     { 
         static int seed = GetTick();
         return ( ((seed = seed * 214013L + 2531011L ) >> 16)& 0x7fff);
     }
Какое-то очень сильное колдунство. Я пытаюсь понять, как из этой формулы будет получаться более-менее правильная случайность, и не понимаю. Почему-то мне казалось, что в формуле должно присутствовать что-нибудь достаточно случайное по своей природе, типа участка из числа Пи...
Мне почему-то кажется, что оно будет давать какие-то закономерности.
Но, в общем, направление ясно. Писать свою функцию рандома и юзать её. Дальше мне гугл подскажет что-нибудь подходящее, спасибо.
— Доктор, меня не понимают...
— вРН БШ ЯЙЮГЮКХ?
Ghaydn вне форума Ответить с цитированием
Старый 27.02.2019, 08:06   #9
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Цитата:
Сообщение от Ghaydn Посмотреть сообщение
как из этой формулы будет получаться более-менее правильная случайность
А никак
В цифровом мире нельзя получить настоящую случайную последовательность без внешнего источника.
waleri вне форума Ответить с цитированием
Старый 27.02.2019, 09:16   #10
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Цитата:
будет получаться более-менее правильная случайность,
она (последовательность) не случайная, она РАВНОМЕРНО распределенная.
случайность задается ОДИН раз в начале(в момент запуска).
НО ведь нам и надо не случайную, а ...
Цитата:
более-менее нормального распределения
а случайность мы отвергаем
Цитата:
нет, то как добиться повторяемости
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Очередной нубский вопрос по SQL nanoflooder SQL, базы данных 2 01.04.2016 22:38
почти нубский вопрос Sater Свободное общение 1 20.11.2012 20:57
Нубский вопрос по строкам в c# Fray120892 C# (си шарп) 1 21.10.2012 16:38
Нубский вопрос Lucius42 Visual C++ 8 14.05.2012 12:52
Очень нубский вопрос zlo_999 Помощь студентам 2 19.12.2011 19:06