Алгоритм генерации случайных чисел с открытым исходным кодом в C++? [закрытый]

Мне удалось решить эту проблему с помощью

this.contentArea.el.scrollToBottom();

Надеюсь, это поможет

6
задан TG. 10 October 2008 в 04:58
поделиться

14 ответов

http://random.org/, если Вам нужны действительно случайные числа

0
ответ дан 8 December 2019 в 02:36
поделиться

Ну, в конечном счете необходимо будет или прекратить генерировать их, или Вы идете в звезду, копирующую их.

На компьютере Ваши опции довольно ограничены Генераторами псевдослучайных чисел (PRNGs) и даны Ваше ограничение, что они никогда не повторяют затем, что PRNG является Вашим наилучшим вариантом - реальные случайные данные будут иногда копировать число.

В Вашем случае я рассмотрел бы использование большого PRNG (32 бита или больше), чтобы переставить Ваши 10 000 чисел и затем отослать числа в переставленном порядке.

После того как они израсходованы, можно переставить снова - так как PRNG является настолько большим, Вы сможете пройти 10k числа много раз прежде, чем копировать последовательность.

Дайте нам больше информации о том, что Ваше выполнение и мы можем придумать лучший ответ.

- Adam

5
ответ дан 8 December 2019 в 02:36
поделиться

Поколение случайных чисел слишком важно, чтобы быть оставленным случиться. - Robert R. Coveyou, Окриджская национальная лаборатория

2
ответ дан 8 December 2019 в 02:36
поделиться

В то время как у Вас может быть требование для генерации последовательности значений, которые не повторяются, Вы не можете назвать результат "случайным". Истинная случайность меньше имеет отношение к отсутствию повторения, чем это имеет отношение к распределению значений в последовательности.

2
ответ дан 8 December 2019 в 02:36
поделиться

Генерируйте большие случайные числа. Скажите 128 битов. Разногласия двух таких чисел, являющихся тем же в ряде 10000, являются смехотворно маленькими (на порядке n^2/2^b, где n = количество необходимых чисел и b = число используемых битов). Учитывая достаточное количество битов, разногласия станут меньшими, чем разногласия Вашего поршня, повреждаемого космическим лучом, таким образом, что Ваш алгоритм перестал работать так или иначе. Будьте осторожны, что пространство, из которого Вы тянете случайные числа действительно, имеет число битов, которые Вы ищете. Легко по ошибке генерировать числа на 128 битов от пула 32 битов (т.е. существует только 2^32 возможности даже при том, что Вы генерируете числа 1 через 2^128). Генераторы случайных чисел в библиотеке повышения могут сделать это правильно для Вас. BTW: если Вам не нравятся 128 битов, то используйте 256 битов или больше пока Вы не удобны, что нет никакого практического шанса коллизии хеширования. Если только необходимо сделать это однажды, то просто используют метод перестановки, уже упомянутый в предыдущем ответе. Это будет иметь преимущество генерации идеального хеша.

2
ответ дан 8 December 2019 в 02:36
поделиться

Числовым Рецептам в C выделили целую главу генерации случайных чисел. Существуют некоторые реализация там. От простого и прямого к комплексу с хорошими статистическими свойствами.

0
ответ дан 8 December 2019 в 02:36
поделиться

mtrand хорош.

2
ответ дан 8 December 2019 в 02:36
поделиться

Это в порядке для опроса всей этой мысли использовать случайное число в качестве уникального ключа для записи базы данных? Я не знаком с sqlite, но это стоит исследовать, поддерживает ли это некоторый уникальный идентификатор столбца внутренне. SQL Server имеет столбцы 'идентификационных данных', например, и Oracle имеет 'последовательности', обе из которых служат той же цели.

2
ответ дан 8 December 2019 в 02:36
поделиться

Повышение. Случайный хороший выбор и хорошо работает для меня. Однако, если Вам не нужны много генераторов случайных чисел и дистрибутивов, можно искать другую библиотеку просто для не установки целого пакета Повышения.

2
ответ дан 8 December 2019 в 02:36
поделиться

TR1 имеет хорошую поддержку случайного числа - если Ваш компилятор поддерживает его.

Иначе повышение

Это в основном, что стало TR1.

До не получения дубликатов - Вы хотите перестановку. Это может быть довольно просто, но существуют некоторые ловушки, если Вы не делаете его правильно. Jeff Atwood привел в порядок хорошую запись некоторое время назад:

http://www.codinghorror.com/blog/archives/001015.html

3
ответ дан 8 December 2019 в 02:36
поделиться

Повышение, вероятно, делает что-то, что не гарантирует повторных чисел. Но некоторое время забавы вот моя идея.

Примечание: Я не пытаюсь генерировать свой рэнд в том направлении, находится безумие.

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


class GaranteedNoRepeatRandom
{
    public:
        GaranteedNoRepeatRandom(int limit)
            :data(limit)
            ,index(0)
        {
            for(int loop=0;loop < limit;++loop)
            {   data[loop]  = loop;
            }
            // Note: random_shuffle optionally takes a third parameter
            // as the rand number generator.
            std::random_shuffle(&data[0],&data[0]+limit);
        }

        unsigned int rand()
        {
            unsigned int result = data[index];
            index   = (index+1) % data.size();

            // Add code to re-shuffle after index wraps around
            return result;
        }
    private:
        std::vector<unsigned int>               data;
        std::vector<unsigned int>::size_type    index;
};

int main()
{
    GaranteedNoRepeatRandom     gen(10000);

    for(int loop =0;loop < 10;++loop)
    {
        std::cout << gen.rand() << "\n";
    }
}
3
ответ дан 8 December 2019 в 02:36
поделиться

Если бы это действительно должно быть в диапазоне 1 к 10,0000 без повторений, но непоследовательный затем, вероятно, было бы лучше сначала создать последовательный массив 10 000 элементов и затем переставить их.

Однако я должен согласиться с комментариями к исходному вопросу. Я не вижу значения в создании их не - последовательный.

Поочередно, в уникальном и непоследовательном важны, затем этот 1 - 10 000 диапазонов становятся сомнительными. Вероятно, было бы лучше просто используемое GUID.

5
ответ дан 8 December 2019 в 02:36
поделиться

Вихрь Мерсенна является лучшим током (хотя я мог быть несколькими неделями позади любых действительно новых исследований). Источник на примерно каждом языке доступен где-нибудь там, и MT также обеспечивается в Повышении здесь

5
ответ дан 8 December 2019 в 02:36
поделиться

Как случайный? Очевидно, существует рэнд (), существует также ОС определенный материал (Windows имеет что-то в CryptoAPI, например). Вы пишете что-то (не рекомендуемый) или просто ищете существующую ранее функцию для использования?

2
ответ дан 8 December 2019 в 02:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: