Случайные числа и генерация тестовых данных ОСНОВЫ ПРОГРАММИРОВАНИЯ Преподаватель:

advertisement
ФГОБУ ВПО "СибГУТИ"
Кафедра вычислительных систем
ОСНОВЫ ПРОГРАММИРОВАНИЯ
Случайные числа и
генерация тестовых данных
Преподаватель:
Доцент Кафедры ВС, к.т.н.
Поляков Артем Юрьевич
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
План лекции
• Случайные числа и их применение в вычислительной технике.
• Подходы к генерации случайных чисел.
• Псевдослучайные числа и алгоритмы их формирования.
• Статистическая проверка случайной природы чисел.
• Тестирование программного обеспечения
• Генерация входных данных
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
2
Применение случайных чисел
Азартные игры и лотереи.
Компьютерное моделирование
Криптография
Компьютерные игры
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
3
Генерация случайных чисел
1. Ранние способы генерации случайных чисел. Их большим недостатком
является крайне низкая скорость генерации.
2. Более эффективными являются физические генераторы случайных чисел,
которые используют природные шумы.
HotBits
Random.org
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
4
Генерация случайных чисел (2)
3. Генерация псевдослучайных чисел.
Генератор псевдослучайных чисел, англ. Pseudo-random number generator
(PRNG), это алгоритм, позволяющий генерировать длинные последовательности
чисел, свойства которых близки к свойствам случайных чисел. Однако такие
последовательности имеют период (повторяются с каким-то расстоянием).
Конкретная последовательность чисел обычно определяется "зерном" из которого
"прорастает" вся остальная последовательность. Алгоритм PRNG для одинакового
значения зерна будет всегда порождать одинаковую последовательность.
Наиболее простым вариантом PRNG является линейный конгруэнтный
генератор (linear congruential generator – LCG), который описывается следующим
рекуррентным соотношением:
x0 = seed
xn+1 = (a∙xn + b) mod m
Период такого генератора (длина неповторяющейся последовательности) не
превышает m.
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
5
Генерация случайных чисел (2)
3. Генерация псевдослучайных чисел.
Генератор псевдослучайных чисел, англ. Pseudo-random number generator
(PRNG), это алгоритм, позволяющий генерировать длинные последовательности
чисел, свойства которых близки к свойствам случайных чисел. Однако такие
последовательности имеют период (повторяются с каким-то расстоянием).
Middle-square
method
seed ← значение
for i ← 0 to n do
rnd[i] = (seed / 1000) % 1000000;
seed = rnd[i]2;
4. Генерация согласно заданному распределению вероятностей.
Такие методы в основном используют числа с равномерным распределением и
известную функцию плотности некоторого распределения (например
нормального).
В зависимости от источника равномерного распределения результат будет либо
псевдослучайным либо случайным.
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
6
Генерация псевдослучайных чисел
Наиболее простым вариантом PRNG является линейный конгруэнтный
генератор (linear congruential generator – LCG), который описывается следующим
рекуррентным соотношением:
x0 = seed
xn+1 = (a∙xn + b) mod m
Source
m
m, m > 0 – модуль (modulus);
a, m > a > 0 – мультипликатор (multiplier);
c, m > c ≥ 0 – инкремент (increment)
x0 – случайное зерно.
a
c
Borland C/C++
232
glibc (GCC)
Borland Delphi,
Virtual Pascal
231
1103515245 12345
232
134775813
22695477
1
Биты xn, формирующие
случайноге число
rand(): 30..16
lrand(): 30..0
30..0
1
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
63..32
7
GNU C Library (glibc)
glibc-2.18/stdlib/random_r.c
int
__random_r (struct random_data *buf,
{
...
int32_t *result)
if (buf->rand_type == TYPE_0)
{
int32_t val = state[0];
val = ((state[0] * 1103515245) + 12345) & 0x7fffffff;
state[0] = val;
*result = val;
}
...
Source
m
glibc (GCC)
231
a
c
1103515245 12345
Биты xn, формирующие
случайноге число
30..0
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
8
GNU C Library (2)
glibc-2.18/stdlib/random_r.c
/* Linear congruential.
#define>TYPE_0
#define>BREAK_0
#define>DEG_0
#define>SEP_0
/* x7 + x3 + 1.
0
8
0
0
/* x15 + x + 1.
#define>TYPE_2
#define>BREAK_2
#define>DEG_2
#define>SEP_2
/* x31 + x3 + 1.
1
32
7
3
*/
#define>TYPE_3
#define>BREAK_3
#define>DEG_3
#define>SEP_3
/* x63 + x + 1.
*/
#define>TYPE_1
#define>BREAK_1
#define>DEG_1
#define>SEP_1
*/
#define>TYPE_4
#define>BREAK_4
#define>DEG_4
#define>SEP_4
3
128
31
3
*/
4
256
63
1
*/
2
64
15
1
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
9
Download