2013-04-14 40 views
3

如何从Matlab中的函数exprnd()在同一分布中获取C#中的数字?Matlab exprnd(a,b,c)模拟C#?

+0

你可以从C#调用matlab函数# 这里阅读http://stackoverflow.com/questions/5901664/calling-a-matlab-function-from-c-sharp或这里http://www.mathworks.com/ help/matlab/matlab_external/call-matlab-function-from-ac-client.html – Elior

回答

3

试着这么做:

static readonly Random randomNumberGenerator = new Random(); 

public static double ExpRnd(double mu) 
{ 
    return -Math.Log(randomNumberGenerator.NextDouble()) * mu; 
} 

如果你想m×n矩阵,使用

public static double[,] ExpRnd(double mu, int m, int n) 
{ 
    var arr = new double[m, n]; 
    for (int i = 0; i < m; ++i) 
    { 
     for (int j = 0; j < n; ++j) 
      arr[i, j] = ExpRnd(mu); 
    } 
    return arr; 
} 

注:System.Random类是线程安全的。如果您有多个线程调用ExpRnd以上,则必须更加小心。

1

您可以使用诸如meta.numerics

一些外部信号处理库在Meta.Numerics.Statistics.Distributions命名空间,看看ExponentialDistribution级及相应的GetRandomValue(Random)方法。

2

本博客文章可以帮助你:

http://ericlippert.com/2012/02/21/generating-random-non-uniform-data/

如果你知道 - 或者可以算出来 - 分布的你想那么位数功能你可以改变(大致)均匀您已经拥有的分销已经进入给定的分销。

正如我在博客文章中所描述的,分位数函数是累积分布的倒数,累积分布是分布下的面积。由于您想要的分配是e -x应该很容易计算出积分和逆。

+0

这也是我的答案的工作原理。 [Wikipedia](http://en.wikipedia.org/wiki/Exponential_distribution#Generating_exponential_variates)给出分位数函数为$ F^{ - 1}(p)= - \ ln(1-p)\ mu $,并注意到“一减”部分可以省略。 –

+1

@JeppeStigNielsen:是的,但是你错过了做所有有趣的微积分,如果你只是*看它*。 :-) –

相关问题