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 для тех же данных отклонение порой достигало одной десятой и выше.
|
|