2013-08-16 2 views
-4

Я пытаюсь создать псевдослучайные ints, используя функцию rand(). Он работает, но моя проблема в том, что он всегда «выбирает» одно и то же имя для int. (В этом случае это 41. Я думаю, что если вы поместите rand() в цикл while, то это 85 или что-то подобное.)rand() Random Number Generation C++

Есть ли способ исправить это? Вот мой код:

#include <iostream> 
    #include <stdio.h> 
    #include <stdlib.h> 

    int guess; 
    int danse = rand() % 101; 

    using namespace std; 

    void more(){ 
    cout << "The number that you need to guess is higher!"; 

    return; 
    } 

    void lower(){ 
    cout << "The number that you need to guess is lower!"; 

    return; 
    } 

    int main(){ 
    while(1){ 
    cout << "\nGuess a number 0-100: "; 
    cin >> guess; 

    if (guess > danse){ 
     lower(); 
} 
    if (guess < danse){ 
     more(); 
} 

    if (guess == 101){ 
     break; 
} 

    if (guess == danse){ 
     cout << "\nYOU GUESSED IT. ARE YOU A WIZARD?! BECAUSE THAT IS PRETTY NEAT."; 
     break; 
} 
    } 
    } 

всего несколько сторона отмечает: Пожалуйста, не пытайтесь сказать мне, что я уже знаю, как, объясняя, почему я использую недействительные функции, с возвратом. Пожалуйста, также не пытайтесь убедить меня, что использование namespace std; это «плохой» способ сделать это. Я понимаю, что есть другие способы сделать это. Я не хочу этого делать.

Спасибо!

+1

Дубликат: http: //stackoverflow.com/q/9421463/1870232 – P0W

ответ

4

Вам необходимо засеять генератор случайных чисел, позвонив по телефону srand один раз перед использованием rand. Текущее время - это дешевый и простой способ выбрать семя, которое варьируется между прогонами вашей программы.

int danse; 

int main(){ 
    srand(time(NULL)); 
    danse = rand() % 101; 
1

Вы не видите генератор случайных чисел, так что это даст вам точно такой же набор «случайных» чисел каждый раз при запуске приложения (это может быть полезно для отладки). Чтобы это исправить, изменить ваш главный выглядеть следующим образом:

int danse = 0; 
int main() 
{ 
    std::srand(std::time(0)); // seed the random number generator 
    danse = rand() % 101; 
    // rest of your main 
} 
+0

Это не сработает, потому что он уже инициализировал 'danse' перед рукой. –

+0

Ах, не видел, чтобы он делал это в объявлении ... Я добавлю это в пример кода. –

2

rand() генерирует псевдослучайные последовательности, начиная с заданного семени. Для любого заданного семени все следующие значения будут равно . По умолчанию, семя 1.

Для того чтобы получить различное значение от каждый раз при запуске программы, вам нужно инициализировать генератор (используя srand()) с чем-тем , что кажется случайным с точки зрения пользователя. Лучшее решение на машине Unix должно читать достаточно байт от "/dev/random", чтобы создать int и использовать это. На других системах вам нужно будет найти что-то еще; time(NULL) - это классическое решение, но, конечно, если программа запущена несколько раз за ту же секунду (даже на разных машинах), будет выводить ту же последовательность. Хеширование дополнительных значений, , как идентификатор процесса, IP-адрес машины или такой, значительно улучшит ситуацию.

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