2016-07-25 4 views
4
#include <stdio.h> 
#include <stdlib.h> 
#include <ctype.h> 
#include <string.h> 
#include <math.h> 

int main() 
{ 
    int i; 
    int diceRoll; 

    for(i=0; i < 20; i++) 
    { 
     printf("%d \n", rand()); 
    } 

    return 0; 
} 

Это код, который я написал в с (CodeBlocks), чтобы получить случайные числа, проблема, я всегда получаю ту же последовательность: 41,18467,6334,26500 и т.д ...случайный список номеров

Я все еще учусь поэтому попробуйте объяснить, как вы разговариваете с 8-летним D:

+1

ли это должен быть код C++ или C#? Кажется, вы пишете C++-код, и вы его отметили как C++, но заголовок и вопрос говорят C#. –

+0

Проверьте это: http://stackoverflow.com/questions/1716308/how-does-a-random-number-generator-work –

+0

[Не используйте 'rand()'] (https: //channel9.msdn. com/Events/GoingNative/2013/rand-Considered-Harmful) – ArchbishopOfBanterbury

ответ

5

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

int main() 
{ 
    srand(time(NULL)); 
    .... 
+0

Спасибо, что работает. Я слежу за учебником по youtube, и парень не написал эту строку. –

+0

@ArshdeepSinghOutarel, который является хорошим знаком, вы должны искать другой учебник. – user4581301

+0

Мой совет - избегать видеоуроков. Вместо этого прочитайте вступительную книгу 'C++' отсюда: http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list – drescherjm

-1

Прежде всего, семена вашей случайной функции путем включения <ctime> и вызова srand(time(NULL));.

Во-вторых, вам нужно по модулю, если вы собираетесь вызвать rand(), например: rand()% x вернет случайное число от 0 до x-1. Поскольку вы имитируете броски кубиков, сделайте rand() % 6 + 1.

+0

Да, я знаю о%. Но он работает без , я использую только srand (time (NULL)); –

1

Генераторы случайных чисел являются псевдослучайными. Это означает, что они используют некоторый «алгоритм», чтобы придумать следующий «случайный» номер. Другими словами, если вы начинаете с того же семени в этом алгоритме, вы получаете одну и ту же последовательность случайных чисел каждый раз. Чтобы решить эту проблему, вы должны убедиться, что вы засеваете генератор случайных чисел. Иногда желательно использовать одно и то же семя, чтобы вы могли определить, работает ли логика вашей программы. В любом случае, один общий способ, с помощью которого люди выкладывают свои программы, - это использование времени (NULL). время дает время, прошедшее (в секундах) с момента эпохи. Это означает, что эта функция меняется каждую секунду. Таким образом, если вы засеете свой генератор случайных чисел с помощью (srand (time (NULL)) в начале программы, вы получите различную последовательность случайных чисел каждую секунду, в которой вы запускаете свою программу. случайное число, которое вы запрашиваете. Просто сделайте это один раз в самом начале вашего кода, а затем оставьте его в покое.

Ваше название говорит C#, но я ответил на C++. Вы захотите включить ctime для этого. может также быть полезным, чтобы посмотреть на новый стиль генерации случайных чисел, поскольку rand() в наши дни не очень случайен. Посмотрите на #include random и сделайте себе двигатель и дистрибутив, чтобы вытащить случайные числа. Не забудьте засеять там также!

-1

Линия srand((unsigned)(time(NULL)) должна быть вне петли, должна введите эту строку только один раз в свой код.

Адрес модели rand()%10 означает, что вы получаете любой номер, начинающийся с 0, подойдя к тому, что вы используете по модулю -1. Так что в этом случае 0-9, если вы хотите 1-10 вы: rand()%10 + 1

int main() 
{ 
    int i; 
    int diceRoll; 

    srand((unsigned)(time(NULL)); 

    for(i=0; i < 20; i++) 
    { 
     printf("%d \n", rand() % 10); //Gets you numbers 0-9 
    } 

    return 0; 
} 
Смежные вопросы