2013-11-25 3 views
4

Вот код у меня есть:Те же случайные числа генерируются каждый раз, когда в C++

int main(int argc, char** argv) { 

    int sleeptime = atoi(argv[1]);  
    int sleepCount = atoi(argv[2]); 

    int sleepTimeRandom = 1 + (rand() % (int)(sleeptime)); 
    int sleepCountRandom = 1 + (rand() % (int)(sleepCount)); 

    sleepTimeRandom = sleepTimeRandom * 1000; 

    DWORD id = GetCurrentProcessId(); 

    cout << "\n\nProcess with id " << id << " will sleep for " << sleepTimeRandom << " milliseconds\n"; 
    cout << "\n\nProcess with id " << id << " will sleep " << sleepCountRandom << " times \n"; 

Когда я называю ех как

sleeper 4 4 

Я всегда получаю 2000 миллисекунд, 4 раза .. Почему?

+1

подсказка: читать на рандов и посевом генераторы случайных чисел. – tletnes

+0

Похоже, нет звонков [srand] (http://www.cplusplus.com/reference/cstdlib/srand/)? – crashmstr

+0

Необходимо вызвать srand() для просмотра функций. См. Http://stackoverflow.com/questions/4926622/how-to-generate-different-random-number-in-a-loop-in-c – OldProgrammer

ответ

11

Вы должны засеять генератор случайных чисел. see here for an example.

не-seeded.c

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

int main() 
{ 
    printf ("Random not seeded: %d\n", rand()%10); 
    return 0; 
} 

не посеяны выход

Random not seeded: 3 
Random not seeded: 3 
Random not seeded: 3 
Random not seeded: 3 
Random not seeded: 3 

seeded.c

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

int main() 
{ 
    srand(time(NULL)); 
    printf ("Random seeded: %d\n", rand()%10); 
    return 0; 
} 

отобранный выход

Random fast seeded: 7 
Random fast seeded: 7 
Random fast seeded: 7 
Random fast seeded: 1 
Random fast seeded: 1 
Random fast seeded: 1 
Random fast seeded: 5 
Random fast seeded: 5 
Random fast seeded: 5 
Random fast seeded: 5 

fast-seeded.c

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

Вот пример, который использует наносекунды вместо time(), который возвращает только секунды.

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

int main() 
{ 
    struct timespec ts; 
    clock_gettime(CLOCK_MONOTONIC, &ts); 

    /* using nano-seconds instead of seconds */ 
    srand((time_t)ts.tv_nsec); 

    printf ("Random fast seeded: %d\n", rand()%10); 
    return 0; 
} 

быстро посеяны выход

Здесь можно увидеть, что номера не сгруппированы так же, как и в предыдущем примере.

Random fast seeded: 9 
Random fast seeded: 6 
Random fast seeded: 5 
Random fast seeded: 6 
Random fast seeded: 1 
Random fast seeded: 1 
Random fast seeded: 9 
Random fast seeded: 4 
Random fast seeded: 3 
Random fast seeded: 2 

равномерно распределенные случайные числа

Если вы заинтересованы в равномерно распределенных случайных чисел, вы должны увидеть user3003631 «s ответ ниже. Если вы действительно используете C++, я бы рекомендовал делать случайные числа. More information here too on this.

2

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

+1

Что сказал rkyser, получил ninja'd: P –

8

Существует также случайная утилита здесь, в C++
в случае, если вы хотите другой подход ... потенциально более высокое качество
Пожалуйста извинить минимум объяснений

#include <iostream> 
#include <algorithm> 
#include <random> 

int random_test_200() 
{ 
    std::random_device rd; 
    uniform_int_distribution<int> ud(1,9); 
    mt19937 mt(rd()); 
    std::vector<int> v1; 
    for (int i = 0; i < 40; ++i) 
    { 
     auto x = ud(mt); 
     v1.push_back(x); 
    } 
} 
+2

Это лучший ответьте здесь, библиотеку C rand следует избегать, как чуму – pyCthon

Смежные вопросы