Больше случайности в C++ [дубликат]

479
16 ноября 2017, 04:44

На данный вопрос уже ответили:

  • Функция rand в цикле 2 ответа

Допустим, есть цикл, смысл которого в один проход 20 раз вызвать функцию srand. Поскольку srand для генерации чисел использует текущее время, то выполняя цикл быстрее,чем в одну секунду, я на выходе получаю 20 одинаковых чисел. Пример кода:

// Example program
#include <iostream>
#include <stdlib.h> //srand
#include <time.h>
using namespace std;
int random_11()
{
     srand(time(NULL)); //Вызываем функцию рандома. Описание функции по ссылке: http://www.cplusplus.com/reference/cstdlib/rand/
    int random_num = rand() % 100; // Генерируем число в пределах 100
    return random_num;
}
int main()
{
    int ar[20];
    int n;
    for (int i = 0; i < 20; i++)
    {
        n = random_11(); // Вызываем функцию для генерации случайного числа
        ar[i] = n;
        cout << ar[i] << '\n';
    }
}

На выходе, мы получим 20 одинаковых значений, которые были сгенерированны в данную секунду. Если изменить значение 20 на, скажем 200,000, то мы будем иметь несколько разных чисел, которые были сгенерированны в течении нескольких секунд.

Суть вопроса: Как реализовать генерацию случайных чисел не привязанную ко времени?

Парни, прошу прощения за свой кретинизм и плохое чтение мануала. По совету совету Владимира Мартьянова, я просто переместил srand(time(NULL)) в main.

// Example program
#include <iostream>
#include <stdlib.h> //srand
#include <sys/time.h>
using namespace std;
int random_11()
{
    int random_num = rand() % 100; 
    return random_num;
}
int main()
{
    srand(time(NULL));
    int ar[20];
    int n;
    for (int i = 0; i < 20; i++)
    {
        n = random_11(); 
        ar[i] = n;
        cout << ar[i] << '\n';
    }
}

Прошу понять, простить и ...

Answer 1

srand() нужно использовать один раз, а не в цикле. Для отвязки от времени передайте аргументом этой функции не время.

Answer 2

Никогда, никогда, НИКОГДА не используйте srand() перед каждым rand().

Ибо rand() сам каждый раз по сути вызывает srand(), инициализируя генератор очередным псевдослучайным значением, а вы мешаете его работе!

Вызвать srand() достаточно один раз, и то только для того, чтоб разные запуски программ работали с разными последовательностями значений.

P.S. Вы же, когда куда-то идете, не начинаете командовать каждой мышце - ты сократись, ты расслабься? А тут от генератора требуете примерно того же - я умней, ты генерирую то, что я говорю. Ну так если умнее - генерируйте сами, не используйте rand()...

READ ALSO
Наложение Images в PictureBox

Наложение Images в PictureBox

Нужно в PictureBox наложить картинки одну на другую фон у них прозрачный по этому не должны перекрывать друг друга

382
Вывод из функции в c++

Вывод из функции в c++

Всем здравствуйте, следующая проблема: У меня есть функция "showArray" она выводит случайные числа, я в "main" приписываю её, а как мне теперь увидеть...

326
Из статического массива в массив с использованием указателей (C++)

Из статического массива в массив с использованием указателей (C++)

Доброго времени сутокЕсть код ниже, который нужно переделать с использованием указателей

277
Дерево не удаляется

Дерево не удаляется

Посмотрите на свои последние две строкиВначале Вы зануляете указатель, а потом удаляете данные по нему, то есть, по null

247