Как генерировать разные случайные числа в цикле в C ++?

c++ loops random

108271 просмотра

13 ответа

Можно ли генерировать разные случайные числа, каждый раз запускается цикл. Например, у меня есть:

for (int t=0;t<10;t++)
{
    int random_x;
    srand ( time(NULL) );
    random_x = rand() % 100;
    cout<<"\nRandom X = "<<random_x;
} 

Но проблема в том, что он генерирует одно и то же случайное число каждый раз. Можно ли генерировать разные случайные числа при каждом запуске цикла?

Есть ли возможность сбросить инициализацию случайных чисел?

Автор: bijlikamasla Источник Размещён: 12.11.2019 09:12

Ответы (13)


26 плюса

Решение

Не используйте srandвнутри цикла, используйте его только один раз, например, в начале main(). И srand()это именно то, как вы сбросите это.

Автор: etarion Размещён: 07.02.2011 09:13

16 плюса

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

Переместите srand()вызов за пределы цикла (и вызывайте его только один раз, в начале вашего приложения), и вы должны получить случайные «случайные» числа.

Автор: payne Размещён: 07.02.2011 09:13

8 плюса

Как не использовать rand(); используйте вместо этого новые средства C ++ 11 (например std::mt19937, std::uniform_int_distributionи т. д.).

Вы можете использовать такой код ( живите здесь на Ideone ):

#include <iostream>
#include <random>
using namespace std;

int main()
{
    // Random seed
    random_device rd;

    // Initialize Mersenne Twister pseudo-random number generator
    mt19937 gen(rd());

    // Generate pseudo-random numbers
    // uniformly distributed in range (1, 100)
    uniform_int_distribution<> dis(1, 100);

    // Generate ten pseudo-random numbers
    for (int i = 0; i < 10; i++)
    {
        int randomX = dis(gen);
        cout << "\nRandom X = " << randomX;
    }
}

PS

Вы можете посмотреть это видео с конференции Going Native 2013 для получения более подробной информации о rand()связанных с этим проблемах:

rand () Считается вредным

Автор: Mr.C64 Размещён: 15.04.2015 11:12

3 плюса

Попробуйте переместить семя srandза пределы цикла следующим образом:

srand ( time(NULL) );
for (int t=0;t<10;t++)
{
    int random_x;
    random_x = rand() % 100;
    cout<< "\nRandom X = "<<random_x;
} 

Как отмечает Марк Рэнсом в комментарии, перемещение семени за пределы цикла поможет, только если цикл не находится в функции, которую вы вызываете несколько раз.

Автор: Tommy Andersen Размещён: 07.02.2011 09:13

1 плюс

У меня была такая же проблема в течение нескольких дней. Хранение srand () вне цикла - это +. Кроме того, не назначайте rand ()% 100 любой переменной. Просто cout rand ()% 100 в цикле. Попробуй это:

    srand (time(NULL));
    (int t=0;t<10;t++)
    {
    cout << rand() % 100 << endl;
    } 
Автор: user3000012 Размещён: 16.11.2013 06:34

0 плюса

Прекратите сеять генератор каждый раз. Вытащите звонок из петли

Автор: Erix Размещён: 07.02.2011 09:13

0 плюса

Переместите srandвызов в начало программы. Как вы понимаете, время между двумя последовательными вызовами может быть одинаковым, поэтому генератор случайных чисел снова запустится в том же месте.

Автор: Mark Ransom Размещён: 07.02.2011 09:14

0 плюса

Вам нужно извлечь инициализацию time () из цикла for.

Вот пример, который выведет в консоль Windows ожидаемое (ахах) случайное число.

#include <iostream>
#include <windows.h>
#include "time.h"
int main(int argc, char*argv[])
{
    srand ( time(NULL) );
    for (int t = 0; t < 10; t++)
    {
        int random_x;

        random_x = rand() % 100;
        std::cout << "\nRandom X = " << random_x << std::endl;
    }
    Sleep(50000);
    return 0;
}
Автор: Xavier V. Размещён: 07.02.2011 09:15

0 плюса

Функция времени, вероятно, возвращает одно и то же значение во время каждой итерации цикла.

Попробуйте инициализировать случайное начальное число перед циклом.

Автор: djp Размещён: 07.02.2011 09:15

0 плюса

На каждой итерации вы сбрасываете последовательность псевдослучайных чисел, потому что вы звоните srandс одним и тем же начальным числом (так как вызов timeочень частый). Либо используйте другое начальное число, либо позвоните srand один раз, прежде чем войти в цикл.

Автор: Marlon Размещён: 07.02.2011 09:16

0 плюса

/*this code is written in Turbo C++
 For Visual Studio, code is in comment*/

int a[10],ct=0,x=10,y=10;    //x,y can be any value, but within the range of 
                             //array declared
randomize();                 //there is no need to use this Visual Studio
for(int i=0;i<10;i++)
{   a[i]=random(10);         //use a[i]=rand()%10 for Visual Studio
}
cout<<"\n\n";
do
{   ct=0;
    for(i=0;i<x;i++)
    {   for(int j=0;j<y;j++)
        {   if(a[i]==a[j]&&i!=j)
            {   a[j]=random(10);    //use a[i]=rand()%10 for Visual Studio
            }
            else
            {   ct++;
            }
        }
    }
}while(!(ct==(x*y)));

Ну, я не профессионал в C ++, но узнал это в школе. Я использую этот алгоритм в течение прошлого года для хранения различных случайных значений в одномерном массиве, но это также будет работать в двумерном массиве после некоторых изменений. Любые предложения по поводу кода приветствуются.

Автор: Sarthik Garg Размещён: 07.10.2017 01:53

0 плюса

Функция rand()работает так, что каждый раз, когда вы вызываете ее, она генерирует случайное число. В своем коде вы вызывали его один раз и сохраняли в переменной random_x. Чтобы получить желаемые случайные числа вместо того, чтобы хранить их в переменной, просто вызовите функцию следующим образом:

for (int t=0;t<10;t++)
{
    cout << "\nRandom X = " << rand() % 100;
}
Автор: Joseph Yu Размещён: 25.08.2019 12:31

-1 плюса

Не знаю мужчин. Я нашел лучший способ для меня после тестирования различных способов, таких как 10 минут. (Измените числа в коде, чтобы получить большое или маленькое случайное число.)

    int x;
srand ( time(NULL) );
x = rand() % 1000 * rand() % 10000 ;
cout<<x;
Автор: Davo Robert Margaryan Размещён: 18.07.2013 10:23
Вопросы из категории :
32x32