# About Random Numbers

Very often, when modeling physical processes, it is necessary to implement a **random number generator** (or simply "random"). Let's start with the basics. In fact, there is no perfect, "correct" random number generator. To some extent, this task can be performed by a girl, as female logic is also a random generator (and a pretty good one). But we are interested in implementing it in **QT**.

The "imperfection" of randomness is that it always has a finite period, after which it repeats the same sequence. But that's not the only problem. Before using randomness, it needs to be initialized - give it a random seed, a starting point. To do this, you need to call the function void **qsrand** (uint seed)

This can be done in many ways, suggesting the simplest one - using the system clock.

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

Now, you can use the function

`int qrand()`

- it returns a value in the range from 0 to 2147483647 (by default, this value can be changed).

The value - can be changed, but editing QT header files for this purpose is not rational. Therefore, you can use the % operation (returns the remainder of division). Like this,

`qrand() % N`

returns numbers in the range from 0 to N - 1.

Naturally, this range can be shifted into the negative region. Like this:

`qrand() % N - K`

We get numbers in the range from -K to N - K - 1

Sometimes, non-integer numbers are needed. First, from 0 to 1. For this, you can use the function:

`#include "qmath.h"`

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

The parameter accuracy is the number of decimal places.

To obtain numbers with a fractional part in a range, simply multiply my_rand(N) by the maximum value of the range:

`max*my_rand(int accuracy)`

We get non-integer numbers in the range from 0 to max.

Alternatively, a simpler (and more rational) option, but you should see an alternative =)):

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

Returns the result with maximum precision.

I hope it's clear with decimals and expanding into the negative region.