簡體   English   中英

對於給定的均值和方差,如何在 c 中生成高斯偽隨機數?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM