ФГОБУ ВПО "СибГУТИ" Кафедра вычислительных систем ОСНОВЫ ПРОГРАММИРОВАНИЯ Случайные числа и генерация тестовых данных Преподаватель: Доцент Кафедры ВС, к.т.н. Поляков Артем Юрьевич © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» План лекции • Случайные числа и их применение в вычислительной технике. • Подходы к генерации случайных чисел. • Псевдослучайные числа и алгоритмы их формирования. • Статистическая проверка случайной природы чисел. • Тестирование программного обеспечения • Генерация входных данных © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 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