О рандоме (случайных числах)
Очень часто при моделировании физических процессов нужно реализовать генератор случайных чисел (или просто «рандом»). Начнём с основ. На самом деле, идеального, «правильного» рандома не существует. Частично, эту задачу может исполнить девушка, ибо женская логика — тоже рандом генератор (причём довольно неплохой). Но нас интересует такая реализация в 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);
}
Возвращает результат с максимальной точностью.
Надеюсь, со знаками после запятой и расширением в отрицательную область понятно.