Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / гсч и random seed: что делать если srand(time(NULL)) не устраивает / 13 сообщений из 13, страница 1 из 1
29.07.2019, 16:41
    #39842621
mini.weblab
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
гсч и random seed: что делать если srand(time(NULL)) не устраивает
написала следующее, но может есть стандартное решение?

rseed.h
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
#ifndef RSEED_H_
#define RSEED_H_

#include <iostream>
#include <chrono>

class RandomSeed {
    private:
        static std::chrono::nanoseconds get_ns();
    public:
        static long get_rseed();
};

#endif /* RSEED_H_ */



rseed.cpp
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
#include <iostream>
#include <chrono>

#include "math.h"
#include "rseed.h"

std::chrono::nanoseconds RandomSeed::get_ns() {
    std::chrono::nanoseconds ns = std::chrono::duration_cast<std::chrono::nanoseconds>
        (std::chrono::system_clock::now().time_since_epoch());

    return ns;
}

long RandomSeed::get_rseed() {
    return RandomSeed::get_ns().count() % INT32_MAX;
}

...
Рейтинг: 0 / 0
29.07.2019, 16:51
    #39842625
Cerebrum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
гсч и random seed: что делать если srand(time(NULL)) не устраивает
...
Рейтинг: 0 / 0
29.07.2019, 17:05
    #39842639
kolobok0
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
гсч и random seed: что делать если srand(time(NULL)) не устраивает
mini.weblab,

там трабла именно в начале последовательности. посему можно поступить до безобразия тупо...
запросить составную часть времени - например мкс. И взять это как кол-во для холостого хода rand()...

удачи вам
(круглый)
...
Рейтинг: 0 / 0
29.07.2019, 18:15
    #39842690
mini.weblab
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
гсч и random seed: что делать если srand(time(NULL)) не устраивает
Cerebrum, kolobok0
спасибо!
...
Рейтинг: 0 / 0
29.07.2019, 20:53
    #39842735
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
гсч и random seed: что делать если srand(time(NULL)) не устраивает
Этот код тестировался где-нибудь? Системные часы оперируют дискретностью в десятки миллисекунд, как следствие наносекуды это просто добавление ноликов в конец, т.е. можно получать одно и тоже на протяжении нескольких миллисекунд .... но могу ошибаться, техника идет вперед ...
...
Рейтинг: 0 / 0
29.07.2019, 21:14
    #39842737
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
гсч и random seed: что делать если srand(time(NULL)) не устраивает
Dima TСистемные часы оперируют дискретностью в десятки миллисекунд, как следствие наносекуды это
просто добавление ноликов в конец, т.е. можно получать одно и тоже на протяжении
нескольких миллисекунд ....

Именно поэтому только нубы вызывают srand() больше одного раза за всё время работы программы.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
30.07.2019, 17:15
    #39843102
mini.weblab
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
гсч и random seed: что делать если srand(time(NULL)) не устраивает
Dima TСистемные часы оперируют дискретностью в десятки миллисекунд, как следствие наносекуды это просто добавление ноликов в конец, т.е. можно получать одно и тоже на протяжении нескольких миллисекунд .... но могу ошибаться, техника идет вперед ...
это неверно, системные часы на современных ОС оперируют с точностью от 100нс
вот ссылка на статью и тесты : https://www.modernescpp.com/index.php/the-three-clocks

точность 100нс означает, что ошибка измерения может составить до 100нс - т.е. ноликов там нет
...
Рейтинг: 0 / 0
30.07.2019, 17:20
    #39843106
mini.weblab
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
гсч и random seed: что делать если srand(time(NULL)) не устраивает
Dimitry Sibiryakov Именно поэтому только нубы вызывают srand() больше одного раза за всё время работы программы.

и что же делать, если программу генерирующую случайную последовательность нужно вызвать 1000 раз подряд?
...
Рейтинг: 0 / 0
30.07.2019, 17:39
    #39843111
mini.weblab
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
гсч и random seed: что делать если srand(time(NULL)) не устраивает
почитала документацию: основные ошибки были с определением переменных
проблема называется initialization of random number generator (random seed) to some distinctive run-time value :-)
т.е мне нужно было, чтобы ре-инициализация гсч проходила чаще чем 1 раз в секунду

поменяла наносекунды на микросекунды (хотя это, скорее всего, избыточно и миллисекунд было бы достаточно)

пока остановилась на этом
rseed.h
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
#ifndef RSEED_H_
#define RSEED_H_

#include <iostream>
#include <chrono>

class RandomSeed {
    private:
        static unsigned long get_current_time();

    public:
        static unsigned int get_rseed();
};

#endif /* RSEED_H_ */



rseed.cpp
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
#include <iostream>
#include <chrono>

#include "math.h"
#include "limits.h"
#include "rseed.h"

unsigned long RandomSeed::get_current_time() {
    std::chrono::microseconds mcs = std::chrono::duration_cast<std::chrono::microseconds>
        (std::chrono::steady_clock::now().time_since_epoch());

    return mcs.count();
}

unsigned int RandomSeed::get_rseed() {
    return RandomSeed::get_current_time() % UINT_MAX;
}

...
Рейтинг: 0 / 0
30.07.2019, 18:12
    #39843123
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
гсч и random seed: что делать если srand(time(NULL)) не устраивает
mini.weblabи что же делать, если программу генерирующую случайную последовательность нужно вызвать
1000 раз подряд?

В пределах одной секунды? Передавать ей сид снаружи или использовать "настоящий" ГСЧ (из
/dev/urand, например).
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
31.07.2019, 20:45
    #39843704
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
гсч и random seed: что делать если srand(time(NULL)) не устраивает
Как было выше замечено - не надо инициализировать ГПСЧ более одного раза. Это же псевдо -случайная последовательность. Зная что инициализация может произойти раз в секунду 100-1000 вариантами элементарно восстановить 100-1000 последовательностей и все их общитать.
...
Рейтинг: 0 / 0
01.08.2019, 08:44
    #39843816
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
гсч и random seed: что делать если srand(time(NULL)) не устраивает
mini.weblabDimitry Sibiryakov Именно поэтому только нубы вызывают srand() больше одного раза за всё время работы программы.

и что же делать, если программу генерирующую случайную последовательность нужно вызвать 1000 раз подряд?пользоваться нормальными генераторами, особенно если это какое-то моделирование - тынц
и ещё хуже если это криптография - тынц

но точно не стандартым
...
Рейтинг: 0 / 0
01.08.2019, 14:15
    #39844101
mini.weblab
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
гсч и random seed: что делать если srand(time(NULL)) не устраивает
это для симуляции шоу Монти Хола, поэтому качество встроенного гсч более чем достаточно, проблема была с частотой инициализации
:-)
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / гсч и random seed: что делать если srand(time(NULL)) не устраивает / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]