2013-11-07 3 views
4

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

void generateLotteryNumbers(int lotteryNumbers[]) 
{ 

    srand (time(NULL)); 
    const int arraySize = 5; 
    int index = 0; 

    while (index < arraySize) 
    { 
     lotteryNumbers[index] = rand() % 50 + 1; 
     cout << lotteryNumbers[index] << endl; 
     index++; 
    } 
} 

Выход на данный момент, например:

5 
24 
45 
26 
47 

Повторные дважды.

+0

http://channel9.msdn.com/Events/GoingNative/2013/rand-Considered-Harmful <- почему вы не должны использовать RAND() и srand() , И почему вам следует избегать «rand()% N». И srand (time (NULL)) ... – Exceptyon

+3

Вы можете взглянуть на функции [C++ 11 ] (http://en.cppreference.com/w/cpp/numeric/random), которые обеспечивают лучшее псевдо генератор случайных чисел (например, Mersenne Twister), а также интерфейс 'random_device', который может использоваться для посева генератора с помощью источника энтропии. – zakinster

ответ

6

Позвоните srandровно один раз, обычно на ранней стадии в main.

+0

Идеал :-) Большое вам спасибо! – KingJohnno

3

Ширина C++ 11 стандарт, вы можете использовать новый number generators. Чтобы получить всегда разные результаты, обычно вы должны установить другое семя при каждом выполнении программы, например, со временем.

1

Вы можете взглянуть на функции c++11, которые обеспечивают лучший генератор псевдослучайных чисел (например, Mersenne Twister), а также интерфейс random_device, который может использоваться для посева генератора с помощью источника энтропии оборудования.

Пример с std::vector и C++ 11 <random> особенности:

vector<int> generateLotteryNumbers(int size) 
{ 
    static std::random_device rseed; 
    static mt19937 rgen(rseed()); 
    uniform_int_distribution<int> idist(1,50); 

    vector<int> result; 
    for(int i = 0; i < size; ++i) { 
     result.push_back(idist(rgen)); 
     cout << result[i] << endl; 
    } 
    return result; 
} 

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

0

Вы не должны звонить по телефону srand несколько раз. Кроме того, вы не должны использовать rand таким образом, чтобы генерировать номера лотереи (нормально, зависит от лотереи, но я думаю, что дублирующиеся номера не допускаются). Вы можете сделать это очень легко с помощью std::random_shuffle

int main() 
{ 
    int numbers[49]; // all numbers 
    std::iota(begin(numbers), end(numbers), 1); // fill with 1-49 

    // shuffle numbers 
    std::random_shuffle(begin(numbers), end(numbers)); 

    // use first 5 numbers: 
    std::copy(begin(numbers), begin(numbers) + 5, 
     std::ostream_iterator<int>(std::cout, " ")); 
} 
Смежные вопросы