генерация случайных массивов в c ++ [дубликаты]

0

Я пытаюсь написать простую функцию, которая генерирует массив со случайными целыми числами.

Я столкнулся с интересной задачей, когда я запускаю эту программу, выходы -each cout statements- кажутся одинаковыми.

Тем не менее, когда я отлаживаю и смотрю его, пошаговые значения массива меняются.

Я делаю что-то неправильно?

Благодарю.

void generateRandomArray( int *&inputArray, int size){

    if(inputArray != NULL){
        delete []inputArray;

    }

    //create a new array
    inputArray = new int [size];

    //fill with random numbers   
    srand(unsigned (time (NULL)));
    for (int i = 0; i < size ; i++)     
        inputArray[i] = (rand() % 100) ;

}
int main(){

    //Variables
    int *inputArray = NULL;
    int size;


    //Test
    size = 10;

    //first call
    generateRandomArray( inputArray, size);

    for(int i = 0 ; i < size; i++){
        cout << inputArray[i] << endl;
    }

    cout << "------------------" << endl;

    //second call
    generateRandomArray( inputArray, size);

    //output is the same with previous
    for(int i = 0 ; i < size; i++){
        cout << inputArray[i] << endl;
    }
    return 0;
}    
  • 7
    Позвони srand один раз.
  • 2
    Вызов srand(time(NULL)); сразу после запуска
Показать ещё 9 комментариев
Теги:
arrays

4 ответа

0

С С++ 11 вы можете использовать что-то вроде: (https://ideone.com/EIb0nY)

#include <iostream>
#include <random>
#include <vector>

std::vector<int> generateRandomArray(std::default_random_engine& generator, int size)
{
    std::uniform_int_distribution<int> distribution(1, 100);
    std::vector<int> res(size);

    for (auto& e : res) {
        e = distribution(generator);
    }
    return res;
}

int main()
{
    std::default_random_engine generator;
    const int size = 10;

    //first call
    for (auto e : generateRandomArray(generator, size)) {
        std::cout << e << std::endl;
    }

    std::cout << "------------------" << std::endl;

    //second call
    for (auto e : generateRandomArray(generator2, size)) {
        std::cout << e << std::endl;
    }
    return 0;
}

Это использует новые случайные объекты.
Это позволяет избежать ручного управления памятью (с помощью std::vector).

0

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

0

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

Когда вы отлаживаете, он будет медленнее и позволит время проходить и иметь разное семя для генератора. Если отладка не выполняется, время между вызовами будет слишком быстрым.

Не вызывайте srand более одного раза, если вы не знаете, что делаете. Поместите его в начало main функции и не вызывайте его снова.

0

Программа выполняется слишком быстро, srand(unsigned (time (NULL))); получит семя с теми же секундами (с эпохи). Следовательно, rand последовательности одинаковы.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню