Pers.narod.ru. Алгоритмы. Генерируем равномерное распределение целых чисел из интервала [-n,n]

Генерацию выполним на C++. Не стоит забывать, что, как и в ряде других языков, стандартная функция random(n) вернёт целое число со значением от 0 до n-1 включительно, и выражение вроде

random (2*n)-n

для генерации и положительных, и отрицательных целых значений будет не совсем корректно, например, при n=3 мы получим в итоге

-3 -2 -1 0 1 2
но никак не тройку.

Правильнее учесть ноль и для генерации целых чисел из диапазона значений [-n,n] написать

random (2*n+1)-n

Тогда при n=3 получаем числа

0 1 2 3 4 5 6

и после вычитания n из случайного числа имеем

-3 -2 -1 0 1 2 3

Для чётного n тоже будет всё нормально: n=4 даст случайные числа от 0 до 8 включительно, затем, после вычитания значения 4, имеем распределение из интервала [-4,4].

Ну а дальше уже всё зависит от случая и от качества генератора случайных чисел :) Например, в старом консольном Borland C++ 3.1 вот эта программа

#include <stdlib.h>
#include <stdio.h>

void main () {
 const long int N=1e6;
 const int n=100;
 randomize();
 double a,s=0;
 for (long int i=0; i<N; i++) {
  a=random (2*n+1)-n; //a in [-n,n]
  s+=a;
 }
 printf ("\nN=%ld,n=%d,S=%16.14lf",N,n,s/N);
}

на количестве шагов N=1000000 и размере диапазона n=100 давала среднее арифметическое до плюс/минус пяти сотых (ожидаемое - ноль), а в C++ Builder для тех же данных отклонение порой достигало одной десятой и выше.

Рейтинг@Mail.ru

вверх гостевая; E-mail
Hosted by uCoz