![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
iPlay |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 177 Регистрация: 23.9.2007 Репутация: нет Всего: 1 |
Народ подскажите как сгенерировать числа по равномерному закону распределения в диапазоне, но так чтобы числа не повторялись??
|
|||
|
||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
А диапазон большой?
Если отбросить варианты с запоминанием уже выпавших, то мне пришло щас в голову следующее. берем числовую последовательность 0,1,2,3,4 шифруем ее, на выходе получаем псевдо-случайную последовательность, без повторений. равномерность распределения, зависит от качества шифра. |
|||
|
||||
afiskon |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 294 Регистрация: 31.3.2011 Где: Россия, Москва Репутация: 1 Всего: 4 |
Если числа не повторяются, они не случайные.
Я так понимаю, вы эти числа потом все равно собираетесь где-то использовать, так? Сгенерируйте массив чисел [N, N+1, N+2, ..., M] и перемешайте его. Алгоритм перемешивания такой:
|
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
вот алгоритм afiskon на Си++
http://liveworkspace.org/code/7da6462caf45...a6ec1a6d7cd8ff5 -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
afiskon |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 294 Регистрация: 31.3.2011 Где: Россия, Москва Репутация: 1 Всего: 4 |
Главное - не забыть про srand.
|
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
на этапе отладки лучше либо не вызывать вообще, либо вызывать, но не со временем, как обычно, а с константой. Для повторяемости. А когда отладился - ага, нужно вызывать. -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
voral |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 158 Регистрация: 16.3.2008 Где: Иваново Репутация: нет Всего: нет |
||||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
Если вся задача и состоит в генерации - то нет никакой разницы, если же эти данные потом используются в сложном алгоритме, то представь, что программа на каких-то данных падает - ну, ошибка в ней. Чтобы повторить падение и найти ошибку тебе нужны те же (не такие же, а те же) данные, потому, что на других данных программа может не падать, и ты не найдёшь ошибку. -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
Qu1nt |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 602 Регистрация: 13.1.2007 Репутация: 1 Всего: 50 |
Как вариант:
http://liveworkspace.org/code/2209546cde5b...b0b60db81e55cfa |
|||
|
||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
Да с перемешиванием неплохо, но только если диапазон небольшой.
Поэтому я и спросил у ТС про диапазон. А если диапазон 3 миллиарда? это-ж сколько памяти надо будет вбухать на какой-то гсч ![]() |
|||
|
||||
afiskon |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 294 Регистрация: 31.3.2011 Где: Россия, Москва Репутация: 1 Всего: 4 |
Вы не забывайте, что у нас помимо ОЗУ есть и ПЗУ. Для нашего удобства в современных ОС есть mapping файлов в память. |
|||
|
||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
Ну даже на диске 12 гигабайт (3 миилиарда * 4 байта), это имхо, слишком для ГСЧ. А время .... ? Да и на 32 разрядных осях вообще с такими массивами очень не сладко придется. Это нужно 64 разрядную ось... ну и т.д. С шифрованием накладные расходы мизерны, как по памяти так и по времени, при любом диапазоне. Но посложнее будет алгоритм. В принципе, если автор топика затребует я бы мог написать основу класса для энтого дела. Но пол часа - часик может уйдет. Ну а если диапазон небольшой, то конечно идея с перемешиванием великолепна! |
|||
|
||||
Alca |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 7 Всего: 50 |
||||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |