0

В с++ хочу сгенерировать рандомное число, но число, которое генерируется с помощью функции rand() с каждым запуском не меняется. Так вот вопрос, как сгенерировать поистине рандомное число, которое с каждым запуском программы будет регенерироваться?

ion
  • 359

1 Answers1

1

Учитывая, что выделяя динамическую память операционная система обычно не повторяется с адресом: то можно значение этого адреса использовать как зерно распределения, как альтернативный способ:

class Seed {
    union {
        const char* p;
        const unsigned n;
    };
public:
    Seed() : p(new char) {}
    operator unsigned() const
    {
        return n;
    }
    ~Seed() { delete p; }
};

И пример применения:

srand(Seed());
for (int i = 0; i < 10; ++i)
    cout << rand() % 100 << ' ';

Просто можно не подключать дополнительный файл.

AR Hovsepyan
  • 15,934
  • 1
    Поведение программы не определено, так как нарушает strict aliasing. – wololo Dec 11 '21 at 15:40
  • В адресном пространстве процесса адрес первого выделенного объекта всегда будет один и тот же. Физически объект может оказаться где угодно, но операционная система скрывает этот факт от процесса с помощью такой штуки как трансляция адресов (виртуальная память). – Stanislav Volodarskiy Dec 12 '21 at 20:21
  • @wololo, не могу согласиться _ объединение тут не причем и речь только про простых программах, а не для повсеместного использования – AR Hovsepyan Dec 13 '21 at 16:45