| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > random по равномерному закону |
| Автор: iPlay 4.7.2011, 19:21 |
| Народ подскажите как сгенерировать числа по равномерному закону распределения в диапазоне, но так чтобы числа не повторялись?? |
| Автор: volatile 4.7.2011, 23:37 |
| А диапазон большой? Если отбросить варианты с запоминанием уже выпавших, то мне пришло щас в голову следующее. берем числовую последовательность 0,1,2,3,4 шифруем ее, на выходе получаем псевдо-случайную последовательность, без повторений. равномерность распределения, зависит от качества шифра. |
| Автор: afiskon 5.7.2011, 06:52 | ||
| Если числа не повторяются, они не случайные. Я так понимаю, вы эти числа потом все равно собираетесь где-то использовать, так? Сгенерируйте массив чисел [N, N+1, N+2, ..., M] и перемешайте его. Алгоритм перемешивания такой:
|
| Автор: borisbn 5.7.2011, 08:52 | ||
вот алгоритм afiskon на Си++
http://liveworkspace.org/code/7da6462caf45b00f9a6ec1a6d7cd8ff5 |
| Автор: afiskon 5.7.2011, 09:01 |
| Главное - не забыть про srand. |
| Автор: borisbn 5.7.2011, 09:03 |
на этапе отладки лучше либо не вызывать вообще, либо вызывать, но не со временем, как обычно, а с константой. Для повторяемости. А когда отладился - ага, нужно вызывать. |
| Автор: borisbn 5.7.2011, 10:20 |
Если вся задача и состоит в генерации - то нет никакой разницы, если же эти данные потом используются в сложном алгоритме, то представь, что программа на каких-то данных падает - ну, ошибка в ней. Чтобы повторить падение и найти ошибку тебе нужны те же (не такие же, а те же) данные, потому, что на других данных программа может не падать, и ты не найдёшь ошибку. |
| Автор: Qu1nt 5.7.2011, 20:48 | ||
Как вариант:
http://liveworkspace.org/code/2209546cde5bee01eb0b60db81e55cfa |
| Автор: volatile 6.7.2011, 00:43 |
| Да с перемешиванием неплохо, но только если диапазон небольшой. Поэтому я и спросил у ТС про диапазон. А если диапазон 3 миллиарда? это-ж сколько памяти надо будет вбухать на какой-то гсч |
| Автор: afiskon 6.7.2011, 08:09 | ||
Вы не забывайте, что у нас помимо ОЗУ есть и ПЗУ. Для нашего удобства в современных ОС есть mapping файлов в память. |
| Автор: volatile 6.7.2011, 13:36 |
Ну даже на диске 12 гигабайт (3 миилиарда * 4 байта), это имхо, слишком для ГСЧ. А время .... ? Да и на 32 разрядных осях вообще с такими массивами очень не сладко придется. Это нужно 64 разрядную ось... ну и т.д. С шифрованием накладные расходы мизерны, как по памяти так и по времени, при любом диапазоне. Но посложнее будет алгоритм. В принципе, если автор топика затребует я бы мог написать основу класса для энтого дела. Но пол часа - часик может уйдет. Ну а если диапазон небольшой, то конечно идея с перемешиванием великолепна! |
| Автор: Alca 7.7.2011, 18:42 |
| http://www.richelbilderbeek.nl/CppRandomNumber.htm |