Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> random по равномерному закону 
:(
    Опции темы
iPlay
Дата 4.7.2011, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 177
Регистрация: 23.9.2007

Репутация: нет
Всего: 1



Народ подскажите как сгенерировать числа по равномерному закону распределения в диапазоне, но так чтобы числа не повторялись??
PM MAIL   Вверх
volatile
Дата 4.7.2011, 23:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



А диапазон большой?
Если отбросить варианты с запоминанием уже выпавших, то мне пришло щас в голову следующее.
берем числовую последовательность 0,1,2,3,4
шифруем ее, на выходе получаем псевдо-случайную последовательность, без повторений.
равномерность распределения, зависит от качества шифра.

PM MAIL   Вверх
afiskon
Дата 5.7.2011, 06:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 294
Регистрация: 31.3.2011
Где: Россия, Москва

Репутация: 1
Всего: 4



Если числа не повторяются, они не случайные.

Я так понимаю, вы эти числа потом все равно собираетесь где-то использовать, так? Сгенерируйте массив чисел [N, N+1, N+2, ..., M] и перемешайте его. Алгоритм перемешивания такой:

Код

для i = 0 .. N
  j = rand(N)
  Arr[i] <-> Arr[j]

PM MAIL WWW   Вверх
borisbn
Дата 5.7.2011, 08:52 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



вот алгоритм afiskon на Си++
Код

#include <stdlib.h>
#include <iostream>

const int COUNT = 10;

int main()
{
    int array[ COUNT ];
    for ( int i = 0; i < COUNT; i++ ) {
       array[ i ] = i;
    }
    for ( int i = 0; i < COUNT; i++ ) {
       int idx = (int)( rand() / (double)RAND_MAX * COUNT );
       if ( i != idx ) {
           int tmp = array[ i ];
           array[ i ] = array[ idx ];
           array[ idx ] = tmp;
       } 
    }       

    for ( int i = 0; i < COUNT; i++ ) {
       std::cout << array[ i ] << " ";
    }
    std::cout << std::endl;
}

http://liveworkspace.org/code/7da6462caf45...a6ec1a6d7cd8ff5


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
afiskon
Дата 5.7.2011, 09:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 294
Регистрация: 31.3.2011
Где: Россия, Москва

Репутация: 1
Всего: 4



Главное - не забыть про srand.
PM MAIL WWW   Вверх
borisbn
Дата 5.7.2011, 09:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Цитата(afiskon @  5.7.2011,  09:01 Найти цитируемый пост)
Главное - не забыть про srand.

на этапе отладки лучше либо не вызывать вообще, либо вызывать, но не со временем, как обычно, а с константой. Для повторяемости. А когда отладился - ага, нужно вызывать.


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
voral
Дата 5.7.2011, 10:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 16.3.2008
Где: Иваново

Репутация: нет
Всего: нет



Цитата(borisbn @  5.7.2011,  09:03 Найти цитируемый пост)
на этапе отладки лучше либо не вызывать вообще, либо вызывать, но не со временем, как обычно, а с константой. Для повторяемости. А когда отладился - ага, нужно вызывать. 

Почему?
PM MAIL WWW   Вверх
borisbn
Дата 5.7.2011, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Цитата(voral @  5.7.2011,  10:07 Найти цитируемый пост)
Почему?

Если вся задача и состоит в генерации - то нет никакой разницы, если же эти данные потом используются в сложном алгоритме, то представь, что программа на каких-то данных падает - ну, ошибка в ней. Чтобы повторить падение и найти ошибку тебе нужны те же (не такие же, а те же) данные, потому, что на других данных программа может не падать, и ты не найдёшь ошибку.


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Qu1nt
Дата 5.7.2011, 20:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 602
Регистрация: 13.1.2007

Репутация: 1
Всего: 50



Как вариант:
Код

#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>

using namespace std;

int main()
{
    srand(time(0));
    const unsigned int size = 10;

    vector<int> data;
    data.reserve(size);
    for (unsigned int i = 0; i < size; ++i)
        data.push_back(i);      
    random_shuffle(data.begin(), data.end());
    copy(data.begin(), data.end(), ostream_iterator<int>(cout, " "));
}

http://liveworkspace.org/code/2209546cde5b...b0b60db81e55cfa
PM MAIL   Вверх
volatile
Дата 6.7.2011, 00:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Да с перемешиванием неплохо, но только если диапазон небольшой.
Поэтому я и спросил у ТС про диапазон. 
А если диапазон 3 миллиарда? это-ж сколько памяти надо будет вбухать на какой-то гсч smile

PM MAIL   Вверх
afiskon
Дата 6.7.2011, 08:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 294
Регистрация: 31.3.2011
Где: Россия, Москва

Репутация: 1
Всего: 4



Цитата(volatile @ 6.7.2011,  00:43)
Да с перемешиванием неплохо, но только если диапазон небольшой.
Поэтому я и спросил у ТС про диапазон. 
А если диапазон 3 миллиарда? это-ж сколько памяти надо будет вбухать на какой-то гсч smile

Вы не забывайте, что у нас помимо ОЗУ есть и ПЗУ. Для нашего удобства в современных ОС есть mapping файлов в память.
PM MAIL WWW   Вверх
volatile
Дата 6.7.2011, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Цитата(afiskon @  6.7.2011,  08:09 Найти цитируемый пост)
в современных ОС есть mapping файлов 

Ну даже на диске 12 гигабайт (3 миилиарда * 4 байта), это имхо, слишком для ГСЧ.  А время .... ?
Да и на 32 разрядных осях вообще с такими массивами очень не сладко придется. Это нужно 64 разрядную ось... ну и т.д.

С шифрованием накладные расходы мизерны, как по памяти так и по времени, при любом диапазоне.
Но посложнее будет алгоритм.
В принципе, если автор топика затребует я бы  мог написать основу класса для энтого дела. Но пол часа - часик может уйдет.
Ну а если диапазон небольшой, то конечно идея с перемешиванием великолепна!

PM MAIL   Вверх
Alca
Дата 7.7.2011, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 7
Всего: 50





--------------------
PM WWW ICQ Skype Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0783 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.