Я пытаюсь написать простую функцию, которая генерирует массив со случайными целыми числами.
Я столкнулся с интересной задачей, когда я запускаю эту программу, выходы -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;
}
С С++ 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
).
Вызовите srand(time(NULL))
и оно будет высевать текущее время и сделать из него случайное число. Поскольку время меняется все время, оно будет давать вам разное количество каждый раз.
Проблема в том, что если вызовы srand
все происходят с той же секундой, генератор будет засеяться с одинаковыми значениями и поэтому генерирует ту же последовательность, всегда.
Когда вы отлаживаете, он будет медленнее и позволит время проходить и иметь разное семя для генератора. Если отладка не выполняется, время между вызовами будет слишком быстрым.
Не вызывайте srand
более одного раза, если вы не знаете, что делаете. Поместите его в начало main
функции и не вызывайте его снова.
Программа выполняется слишком быстро, srand(unsigned (time (NULL)));
получит семя с теми же секундами (с эпохи). Следовательно, rand последовательности одинаковы.
srand
один раз.srand(time(NULL));
сразу после запуска