2013-04-14 61 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:是的,但是你錯過了做所有有趣的微積分,如果你只是*看它*。 :-) –

相關問題