rand () не изменяет значения при повторном запуске в C ++ [duplicate]

0

Я делаю функцию, чтобы сделать другое случайное значение, когда я снова запускаю исполняемый файл. Это моя функция, чтобы сделать бит 0 и 1. В первый раз я запускаю его и получаю вывод 0 1 1 1. И я запускаю.exe, результат аналогичен предыдущему времени. Что происходит? Я хочу другой выход, когда я снова забегаю. Вы можете мне помочь?

int randBit()
{
    int bit;
    double randval;
    randval = (double)rand()/(double)RAND_MAX;
    if(randval<0.5) bit=0;
    else bit=1;
    return bit;
}
  • 2
    Используйте srand(time(NULL)) перед rand()
  • 2
    @AlterMann: похоже на ответ мне ...
Показать ещё 1 комментарий
Теги:

5 ответов

4

Вот решение, использующее заголовок <random>.

std::random_device rd;
std::mt19937 mt(rd());
std::uniform_int_distribution<int> dist (0,1);
int random_number = dist(mt);

Вызовите dist(mt) каждый раз, когда вам нужно новое случайное число.

2

Вам нужна функция srand main.

семя это со временем:

  #include <time.h> //header for time

  int main(){
       srand(time(NULL)); // call only once and preferably at the start of main 

       // your code including the function randBit()

       return 0;
 }

Вот пример кода:

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

int randBit()
{
   int bit;
   double randval;
   randval = (double)rand()/(double)RAND_MAX;
   if(randval<0.5) bit=0;
   else bit=1;
   return bit;
}

int main(){

      srand(time(NULL));
      int i=0,random=0;

      for(i=0;i<100;i++){
            random = randBit();
            printf("%d ",random);
      }

      printf("\n");  
      return 0;
}

И это результат:

Notra: Рабочий стол Sukhvir $./test

1 1 0 0 1 1 0 1 0 0 1 0 0 1 1 0 1 1 0 1 1 0 0 0 0 1 0 1 0 1 1 0 1 1 0 1 0 0 0 1 0 0 1 1 1 1 0 1 0 0 0 1 1 1 0 0 0 1 0 1 1 1 0 0 1 0 1 1 1 0 0 0 1 0 1 0 1 0 1 1 1 1 0 1 1 0 0 0 1 0 1 1 0 0 1 0 1 1 0 1

0

Функция rand() в C является псевдослучайной и, следовательно, ей требуется семя. Это семя может быть любым числом, но обычно это текущее время, данные датчика или что-либо еще, что менее предсказуемо.

Семя имеет значение по умолчанию, которое приводит к той же последовательности "случайных" чисел при каждом запуске программы. Чтобы установить семя, вы можете использовать srand(), например srand(time(NULL)) чтобы использовать текущее время в качестве семени. Случайное значение вычисляется из семени и, следовательно, rand() калоуцирует новый по каждому вызову на основе предыдущего.

0

Вы должны вызвать srand() перед первым вызовом rand(). Для Windows вы можете использовать:

srand( GetTickCount() );

И платформенно-независимый вариант:

srand( time(NULL) );
  • 2
    Это нужно только один раз. Не каждый раз перед вызовом rand ().
  • 0
    Что такое библиотека GetTickCount (). Я использую Visual Studio 2010
Показать ещё 2 комментария
0

С manpage:

Функция rand() возвращает псевдослучайное целое число в диапазоне от 0 до RAND_MAX включительно.

Это означает, что rand фактически не генерирует случайные значения для каждого вызова, но берет семя в качестве начального значения и генерирует псевдослучайные значения на основе этого семени. При определенном семени каждая последовательность вызовов в rand() будет обеспечивать такую же последовательность "случайных" чисел.

Семя может быть инициализировано с помощью функции srand(), и хороший подход к тому, чтобы иметь различную последовательность произведенных чисел в каждом выполнении, - использовать time(NULL) в качестве семени.

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

Приветствия.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню