我需要在C中创建高斯分布随机数矩阵。我很好奇matlab如何生成它以便我可以从中取得领先。
答案 0 :(得分:1)
要生成正常随机数,C代码:
#include <stdlib.h>
#include <math.h>
#ifndef M_PI
#define M_PI 3.14159265358979323846
#endif
double drand() /* uniform distribution, (0..1] */
{
return (rand()+1.0)/(RAND_MAX+1.0);
}
double random_normal()
/* normal distribution, centered on 0, std dev 1 */
{
return sqrt(-2*log(drand())) * cos(2*M_PI*drand());
}
如果我想创建一个平均值为1且std为0.5的随机变量,那么
int main()
{
int i;
double rands[1000];
for (i=0; i<1000; i++)
rands[i] = 1.0 + 0.5*random_normal();
return 0;
}
答案 1 :(得分:1)
如果您正在尝试学习,请查看this。 最常见的实用方法是Box-Muller或Marsaglia。
然后看看this。
IMO你应该使用一个合适的随机生成器,通常是Mersenne Twister,你可以找到实现here。
最后,当然如果您可以选择使用C ++,请使用C ++ 11 random library。
答案 2 :(得分:0)
Matlab uses ziggurat algorithm的变种。有关您可以使用的其他技巧,请参阅Wikipedia。其他答案中提到的Box-Muller方法相对容易理解和实现,但比ziggurat算法慢,并且还受到与Linear Congruential Generators的交互的影响,这导致所有fall along spirals的生成值。