У меня еще нет способности добавить "комментарии", таким образом, я добавляю это как ответ: это было предложено Joel Spolsky , что такие вопросы будут лучше всего формулироваться как "один инструмент на ответ" - это позволило бы голосовать по отдельным средствам разработки, таким образом, более вероятно, даст Вам список, в порядке популярности, лучших инструментов для имения.
См. Эту статью CodeProject: Генерация простых случайных чисел . Код очень короткий, и он генерирует выборки из равномерного, нормального и экспоненциального распределений.
You might be interested in Math.NET, specifically the Numerics package.
Caveat: The numerics package targets .NET 3.5. You may need to use the Iridium package if you are targeting an earlier version...
Вот пример C, который возвращает два значения (rand1 и rand2) только потому, что алгоритм эффективно это делает. Это полярная форма преобразования Бокса-Мюллера .
void RandVal (double mean1, double sigma1, double *rand1, double mean2, double sigma2, double *rand2)
{
double u1, u2, v1, v2, s, z1, z2;
do {
u1 = Random (0., 1.); // a uniform random number from 0 to 1
u2 = Random (0., 1.);
v1 = 2.*u1 - 1.;
v2 = 2.*u2 - 1.;
s = v1*v1 + v2*v2;
} while (s > 1. || s==0.);
z1 = sqrt (-2.*log(s)/s)*v1;
z2 = sqrt (-2.*log(s)/s)*v2;
*rand1 = (z1*sigma1 + mean1);
*rand2 = (z2*sigma2 + mean2);
return;
}
Sorry I don't have any code for you but I can point you to some algorithms on Wikipedia. The algorithm you choose I guess depends on how accurate you want it and how fast it needs to be.
Библиотека MetaNumerics , также .NET, вычислит нормальное распределение (и почти все остальное из статистики) очень быстро. Взгляните на страницу функции для более подробной информации. Страница Codeplex находится здесь: http://metanumerics.codeplex.com/ .