Генерируем равномерное распределение целых чисел из интервала [-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 для тех же данных отклонение порой достигало одной десятой и выше.
22.11.2012, 16:21 [11353 просмотра]