3 / 3 / 2
Регистрация: 19.07.2015
Сообщений: 74
|
|||||||||||
1 | |||||||||||
Функция rand() дает странные результаты10.01.2016, 19:24. Показов 1338. Ответов 7
Метки нет (Все метки)
Есть класс Owner с таким конструктором, значения его членов определяются рандомно. В main.cpp создаются и выводятся на экран последовательно 3 объекта Owner:
Я правильно понимаю, что это из-за использования значения времени, которое мало меняется при выполнении программы? И что делать в таком случае?
0
|
10.01.2016, 19:24 | |
Ответы с готовыми решениями:
7
Rand выдает не те результаты Странные результаты деления Странные результаты при вычислении корней Странные результаты вычисления синусов и косинусов |
320 / 270 / 128
Регистрация: 24.05.2012
Сообщений: 629
|
|
10.01.2016, 19:35 | 2 |
Сообщение было отмечено parsecer как решение
Решение
Правильно. Что делать - вызывать
srand только один раз, в самом начале main .
0
|
Модератор
|
||||||
10.01.2016, 20:33 | 3 | |||||
Вызывать srand() можно и в пользовательской функции. Но вызывать её надо перед вызовом функции rand(), и только один раз. Сделать это можно, указав перед srand() ключевое слово static.
0
|
320 / 270 / 128
Регистрация: 24.05.2012
Сообщений: 629
|
|
10.01.2016, 22:21 | 4 |
Разумеется. Я лишь предложил самый простой вариант, где это можно сделать. Вообще правильнее было бы вызывать в конструкторе приватного статического объекта-одиночки.
Код с static srand(time(NULL)); не компилируется:C89/C99/C11/GNU89/GNU99/GNU11: Код
test.c:21:18: error: expected declaration specifiers or ‘...’ before ‘time’ Код
test.cpp:12:18: error: ISO C++ forbids declaration of ‘srand’ with no type [-fpermissive] Не уверен, что понял правильно сообщение от компилятора C, но, вроде бы, он думает, что я забыл указать тип параметра time в прототипе функции srand.
0
|
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
|
||||||
10.01.2016, 23:03 | 5 | |||||
последствие моих советов?
На каждом новом запуске программы будет одна и та же последовательность. Это до random из c++11. Такое вот есть отличие.
Сразу после main srand. Совет поста 2.
0
|
320 / 270 / 128
Регистрация: 24.05.2012
Сообщений: 629
|
|
10.01.2016, 23:09 | 6 |
Но ведь это означает
static int srand = time(NULL); , то есть мы объявляем локальную статичную переменную srand и присваиваем ей текущее время (еще и с downcast'ом от time_t {aka long} к int ).
0
|
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
|
|||||||||||||||||||||
10.01.2016, 23:57 | 7 | ||||||||||||||||||||
Ну да. Так и есть. Не нравится? Тогда можно использовать медленный вариант.
static srand(time(NULL)); Не выйдет, потому как здесь происходит попытка использовать static в месте вызова функции для вызова функции как для переменной, а не для обозначения переменной как переменной. Это так же как вот эта, весьма странная конструкция (не рабочая и не должна работать)
0
|
Модератор
|
||||||
11.01.2016, 06:12 | 8 | |||||
Ахахаха, точняк
Ну, тогда, вот такой костыль:
Или, как верно сказал Кот Ангенс, использовать Singleton.
0
|
11.01.2016, 06:12 | |
11.01.2016, 06:12 | |
Помогаю со студенческими работами здесь
8
Функция rand() Функция rand Функция rand() Функция rand Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |