О рандоме (случайных числах)

Очень часто при моделировании физических процессов нужно реализовать генератор случайных чисел (или просто «рандом»). Начнём с основ. На самом деле, идеального, «правильного» рандома не существует. Частично, эту задачу может исполнить девушка, ибо женская логика — тоже рандом генератор (причём довольно неплохой). Но нас интересует такая реализация в QT.

«Неидеальность» рандома в том, что он всегда имеет конечный период, после которого повторяет ту же последовательность. Но не только в этом беда. Перед использованием рандом нужно инициализировать — дать ему случайную метку, точку отсчёта. Для этого нужно вызвать функцию void qsrand ( uint seed )

Сделать это можно многими методами, предлагая самый простой — использовать системные часы.

 
#include "QTime"
QTime midnight(0,0,0);
qsrand(midnight.secsTo(QTime::currentTime()));

Теперь можно использовать функцию

 

int qrand()

- она возвращает значение в диапазоне от 0 до 2147483647 (по умолчанию, это значение можно изменить).

Значение — то можно изменить, но править заголовочные файлы QT ради этого нерационально. Поэтому можно пользоваться операцией % (возращает остачу от деления). Так, 

 

qrand() % N

возвращает числа в диапазоне от 0 до N — 1.

Естественно, этот диапазон можно сдвинуть в отрицательную область. Таким вот образом:

 

qrand() % N - K

Получим числа в диапазоне от - K до N - K - 1

Иногда надо получить нецелые числа. Для начала, от 0 до 1. Для этого можно использовать функцию:

#include "qmath.h"

double my_rand(int accuracy) { double a = 0; a = (qrand() % int (qPow(10, accuracy) + 1))/qPow(10, accuracy); return a; }

Параметр accuracy - количество десятичных знаков.

Для получения чисел с дробной частью в диапазоне, достаточно умножить my_rand(N) на максимальное значение диапазона:

max*my_rand(int accuracy)

Получим нецелые числа в диапазоне от 0 до max.

Либо, вариант попроще (и самый рациональный, но вы ведь долны видеть альтернативу =)):

double QDiffusion::my_rand()
{
return (double)rand()/(RAND_MAX);
}

Возвращает результат с максимальной точностью.

Надеюсь, со знаками после запятой и расширением в отрицательную область понятно.