![](/img/trans.png)
[英]How generate pseudo-random numbers in uniform and gaussian distribution without float/double numbers?
[英]how to generate gaussian pseudo random numbers in c for a given mean and variance?
我這里有一個代碼,它生成平均為 0f 1 和標准偏差為 0.5 的隨機數。 但是我如何修改這段代碼,以便我可以對任何給定均值和方差的高斯隨機數進行否定?
#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());
}
int main()
{
int i;
double rands[1000];
for (i=0; i<1000; i++)
rands[i] = 1.0 + 0.5*random_normal();
return 0;
}
我這里有一個代碼,它生成平均為 0f 1 和標准偏差為 0.5 的隨機數。 但是我如何修改這段代碼,以便我可以對任何給定均值和方差的高斯隨機數進行否定?
如果x
是來自具有均值μ
和標准偏差σ
的高斯分布的隨機變量,則αx+β
將具有均值αμ+β
和標准偏差|α|σ
。
實際上,您發布的代碼已經進行了這種轉換。 它從一個均值為 0、標准差為 1 的隨機變量開始(從 function random_normal
獲得,它實現了Box–Muller 變換),然后將其轉換為一個均值為 1、標准差為 0.5 的隨機變量(在rands
數組中)通過乘法和加法:
double random_normal(); /* normal distribution, centered on 0, std dev 1 */
rands[i] = 1.0 + 0.5*random_normal();
有幾種方法可以做到這一點 - 所有這些基本上都涉及將均勻分布的值轉換/映射到正態/高斯分布。 Ziggurat轉換可能是您最好的選擇。
需要記住的一件事 - 最終分布的質量僅與 RNG 一樣好,因此如果生成值的質量很重要,請務必使用質量隨機數生成器(例如 Mersenne twister)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.