[{"data":1,"prerenderedAt":717},["ShallowReactive",2],{"\u002F2012-05-03-c%E6%AD%A3%E6%80%81%E9%9A%8F%E6%9C%BA%E6%95%B0%E7%94%9F%E6%88%90":3},{"id":4,"title":5,"body":6,"date":694,"description":12,"extension":695,"meta":696,"navigation":64,"path":710,"seo":711,"stem":712,"tags":713,"__hash__":716},"blogs\u002F_legacy\u002F2012\u002F2012-05-03-c%e6%ad%a3%e6%80%81%e9%9a%8f%e6%9c%ba%e6%95%b0%e7%94%9f%e6%88%90.md","C++正态随机数生成",{"type":7,"value":8,"toc":692},"minimark",[9,13,21,476,487,490,669,688],[10,11,12],"p",{},"最近碰到了c++生成正态随机数的问题，在这里把查到的资料整理一下。",[10,14,15,16,20],{},"正态随机数最便捷的方法是使用libstdc++，在C++11. 26.5-1版本后标准库中已经加入了",[17,18,19],"code",{},"\u003Crandom>","来处理对随机数的生成。下面的代码就是一个简单的生成过程：",[22,23,28],"pre",{"className":24,"code":25,"language":26,"meta":27,"style":27},"language-cpp shiki shiki-themes github-light-high-contrast github-dark monokai","#include \u003Crandom>\n#include \u003Ctime.h>\n#include \u003Ciostream>\n\ntypedef std::ranlux64_base_01 Myeng;  \ntypedef std::normal_distribution\u003Cdouble> Mydist;\n\nint main( int argc, char* args[] )\n{\n\n  Myeng eng;  \n  eng.seed(time(NULL));\u002F\u002F将时间作为seed\n  Mydist dist(1.5, 2.0);  \n  Mydist::input_type engval = eng();  \n  Mydist::result_type distval = dist(eng); \n\n  distval = distval; \u002F\u002F 防止出现\"xxxx未使用\"的报错  \n  engval = engval;  \n\n  std::cout\u003C\u003Cd\u003C\u003Cstd::endl;\n  std::cout \u003C\u003C \"期望== \" \u003C\u003C dist.mean() \u003C\u003C std::endl;  \n  std::cout \u003C\u003C \"标准差== \" \u003C\u003C dist.sigma() \u003C\u003C std::endl;  \n\n  dist.reset(); \u002F\u002F 清除缓存值  \n  std::cout \u003C\u003C \"随机数1 == \" \u003C\u003C dist(eng) \u003C\u003C std::endl;  \n  std::cout \u003C\u003C \"随机数2 == \" \u003C\u003C dist(eng) \u003C\u003C std::endl;  \n  std::cout \u003C\u003C \"随机数3 == \" \u003C\u003C dist(eng) \u003C\u003C std::endl;  \n\n}\n","cpp","",[17,29,30,43,51,59,66,80,103,108,142,148,153,162,190,212,235,255,260,274,285,290,313,345,372,377,392,417,441,465,470],{"__ignoreMap":27},[31,32,35,39],"span",{"class":33,"line":34},"line",1,[31,36,38],{"class":37},"sLXdl","#include",[31,40,42],{"class":41},"sZnmU"," \u003Crandom>\n",[31,44,46,48],{"class":33,"line":45},2,[31,47,38],{"class":37},[31,49,50],{"class":41}," \u003Ctime.h>\n",[31,52,54,56],{"class":33,"line":53},3,[31,55,38],{"class":37},[31,57,58],{"class":41}," \u003Ciostream>\n",[31,60,62],{"class":33,"line":61},4,[31,63,65],{"emptyLinePlaceholder":64},true,"\n",[31,67,69,72,76],{"class":33,"line":68},5,[31,70,71],{"class":37},"typedef",[31,73,75],{"class":74},"sfUV7"," std",[31,77,79],{"class":78},"s0idv","::ranlux64_base_01 Myeng;  \n",[31,81,83,85,87,90,93,97,100],{"class":33,"line":82},6,[31,84,71],{"class":37},[31,86,75],{"class":74},[31,88,89],{"class":78},"::normal_distribution",[31,91,92],{"class":37},"\u003C",[31,94,96],{"class":95},"sGZGq","double",[31,98,99],{"class":37},">",[31,101,102],{"class":78}," Mydist;\n",[31,104,106],{"class":33,"line":105},7,[31,107,65],{"emptyLinePlaceholder":64},[31,109,111,114,118,121,123,127,130,133,136,139],{"class":33,"line":110},8,[31,112,113],{"class":95},"int",[31,115,117],{"class":116},"scAT4"," main",[31,119,120],{"class":78},"( ",[31,122,113],{"class":95},[31,124,126],{"class":125},"sbfHu"," argc",[31,128,129],{"class":78},", ",[31,131,132],{"class":95},"char",[31,134,135],{"class":37},"*",[31,137,138],{"class":125}," args",[31,140,141],{"class":78},"[] )\n",[31,143,145],{"class":33,"line":144},9,[31,146,147],{"class":78},"{\n",[31,149,151],{"class":33,"line":150},10,[31,152,65],{"emptyLinePlaceholder":64},[31,154,156,159],{"class":33,"line":155},11,[31,157,158],{"class":74},"  Myeng",[31,160,161],{"class":78}," eng;  \n",[31,163,165,168,171,174,177,179,183,186],{"class":33,"line":164},12,[31,166,167],{"class":78},"  eng.",[31,169,170],{"class":116},"seed",[31,172,173],{"class":78},"(",[31,175,176],{"class":116},"time",[31,178,173],{"class":78},[31,180,182],{"class":181},"stP0Q","NULL",[31,184,185],{"class":78},"));",[31,187,189],{"class":188},"sZdD5","\u002F\u002F将时间作为seed\n",[31,191,193,196,199,201,204,206,209],{"class":33,"line":192},13,[31,194,195],{"class":74},"  Mydist",[31,197,198],{"class":116}," dist",[31,200,173],{"class":78},[31,202,203],{"class":181},"1.5",[31,205,129],{"class":78},[31,207,208],{"class":181},"2.0",[31,210,211],{"class":78},");  \n",[31,213,215,217,220,223,226,229,232],{"class":33,"line":214},14,[31,216,195],{"class":74},[31,218,219],{"class":78},"::",[31,221,222],{"class":74},"input_type",[31,224,225],{"class":78}," engval ",[31,227,228],{"class":37},"=",[31,230,231],{"class":116}," eng",[31,233,234],{"class":78},"();  \n",[31,236,238,240,242,245,248,250,252],{"class":33,"line":237},15,[31,239,195],{"class":74},[31,241,219],{"class":78},[31,243,244],{"class":74},"result_type",[31,246,247],{"class":78}," distval ",[31,249,228],{"class":37},[31,251,198],{"class":116},[31,253,254],{"class":78},"(eng); \n",[31,256,258],{"class":33,"line":257},16,[31,259,65],{"emptyLinePlaceholder":64},[31,261,263,266,268,271],{"class":33,"line":262},17,[31,264,265],{"class":78},"  distval ",[31,267,228],{"class":37},[31,269,270],{"class":78}," distval;",[31,272,273],{"class":188}," \u002F\u002F 防止出现\"xxxx未使用\"的报错  \n",[31,275,277,280,282],{"class":33,"line":276},18,[31,278,279],{"class":78},"  engval ",[31,281,228],{"class":37},[31,283,284],{"class":78}," engval;  \n",[31,286,288],{"class":33,"line":287},19,[31,289,65],{"emptyLinePlaceholder":64},[31,291,293,296,299,302,305,307,310],{"class":33,"line":292},20,[31,294,295],{"class":74},"  std",[31,297,298],{"class":78},"::cout",[31,300,301],{"class":37},"\u003C\u003C",[31,303,304],{"class":78},"d",[31,306,301],{"class":37},[31,308,309],{"class":74},"std",[31,311,312],{"class":78},"::endl;\n",[31,314,316,318,321,323,326,329,332,335,338,340,342],{"class":33,"line":315},21,[31,317,295],{"class":74},[31,319,320],{"class":78},"::cout ",[31,322,301],{"class":37},[31,324,325],{"class":41}," \"期望== \"",[31,327,328],{"class":37}," \u003C\u003C",[31,330,331],{"class":78}," dist.",[31,333,334],{"class":116},"mean",[31,336,337],{"class":78},"() ",[31,339,301],{"class":37},[31,341,75],{"class":74},[31,343,344],{"class":78},"::endl;  \n",[31,346,348,350,352,354,357,359,361,364,366,368,370],{"class":33,"line":347},22,[31,349,295],{"class":74},[31,351,320],{"class":78},[31,353,301],{"class":37},[31,355,356],{"class":41}," \"标准差== \"",[31,358,328],{"class":37},[31,360,331],{"class":78},[31,362,363],{"class":116},"sigma",[31,365,337],{"class":78},[31,367,301],{"class":37},[31,369,75],{"class":74},[31,371,344],{"class":78},[31,373,375],{"class":33,"line":374},23,[31,376,65],{"emptyLinePlaceholder":64},[31,378,380,383,386,389],{"class":33,"line":379},24,[31,381,382],{"class":78},"  dist.",[31,384,385],{"class":116},"reset",[31,387,388],{"class":78},"();",[31,390,391],{"class":188}," \u002F\u002F 清除缓存值  \n",[31,393,395,397,399,401,404,406,408,411,413,415],{"class":33,"line":394},25,[31,396,295],{"class":74},[31,398,320],{"class":78},[31,400,301],{"class":37},[31,402,403],{"class":41}," \"随机数1 == \"",[31,405,328],{"class":37},[31,407,198],{"class":116},[31,409,410],{"class":78},"(eng) ",[31,412,301],{"class":37},[31,414,75],{"class":74},[31,416,344],{"class":78},[31,418,420,422,424,426,429,431,433,435,437,439],{"class":33,"line":419},26,[31,421,295],{"class":74},[31,423,320],{"class":78},[31,425,301],{"class":37},[31,427,428],{"class":41}," \"随机数2 == \"",[31,430,328],{"class":37},[31,432,198],{"class":116},[31,434,410],{"class":78},[31,436,301],{"class":37},[31,438,75],{"class":74},[31,440,344],{"class":78},[31,442,444,446,448,450,453,455,457,459,461,463],{"class":33,"line":443},27,[31,445,295],{"class":74},[31,447,320],{"class":78},[31,449,301],{"class":37},[31,451,452],{"class":41}," \"随机数3 == \"",[31,454,328],{"class":37},[31,456,198],{"class":116},[31,458,410],{"class":78},[31,460,301],{"class":37},[31,462,75],{"class":74},[31,464,344],{"class":78},[31,466,468],{"class":33,"line":467},28,[31,469,65],{"emptyLinePlaceholder":64},[31,471,473],{"class":33,"line":472},29,[31,474,475],{"class":78},"}\n",[10,477,478,479,486],{},"关于random库的更多的内容可参照",[480,481,485],"a",{"href":482,"rel":483},"http:\u002F\u002Fgcc.gnu.org\u002Fonlinedocs\u002Flibstdc++\u002Flibstdc++-api-4.6\u002Fa01210.html",[484],"nofollow","参考文档","，文字太多了我也没仔细看，只是参照别人的代码改了下就拿来用了。",[10,488,489],{},"当然，如果你没有使用标准库的习惯的话（其实本人也不是很喜欢用标准库），你也可以利用rand()函数自己生成正态随机数。根据采用的数学原理不同，似乎会用很多种方法。下面的是采用由瑞利分布导出的公式为基础来生成正态随机数的。",[22,491,493],{"className":24,"code":492,"language":26,"meta":27,"style":27},"double carmen_gaussian_random(double mean, double std)\n{\n  const double norm = 1.0 \u002F (RAND_MAX + 1.0);\n  double u = 1.0 - rand() * norm;                  \u002F\u002Fu不能为 0 \n  double v = rand() * norm;     \u002F\u002F由于是伪随机请自行选择seed来保证更真实的随机\n  double z = sqrt(-2.0 * log(u)) * cos(2.0 * M_PI * v);\n  return mean + std * z;\n}\n",[17,494,495,518,522,552,580,600,647,665],{"__ignoreMap":27},[31,496,497,499,502,504,506,509,511,513,515],{"class":33,"line":34},[31,498,96],{"class":95},[31,500,501],{"class":116}," carmen_gaussian_random",[31,503,173],{"class":78},[31,505,96],{"class":95},[31,507,508],{"class":125}," mean",[31,510,129],{"class":78},[31,512,96],{"class":95},[31,514,75],{"class":125},[31,516,517],{"class":78},")\n",[31,519,520],{"class":33,"line":45},[31,521,147],{"class":78},[31,523,524,527,530,533,535,538,541,544,547,549],{"class":33,"line":53},[31,525,526],{"class":37},"  const",[31,528,529],{"class":95}," double",[31,531,532],{"class":78}," norm ",[31,534,228],{"class":37},[31,536,537],{"class":181}," 1.0",[31,539,540],{"class":37}," \u002F",[31,542,543],{"class":78}," (RAND_MAX ",[31,545,546],{"class":37},"+",[31,548,537],{"class":181},[31,550,551],{"class":78},");\n",[31,553,554,557,560,562,564,567,570,572,574,577],{"class":33,"line":61},[31,555,556],{"class":95},"  double",[31,558,559],{"class":78}," u ",[31,561,228],{"class":37},[31,563,537],{"class":181},[31,565,566],{"class":37}," -",[31,568,569],{"class":116}," rand",[31,571,337],{"class":78},[31,573,135],{"class":37},[31,575,576],{"class":78}," norm;",[31,578,579],{"class":188},"                  \u002F\u002Fu不能为 0 \n",[31,581,582,584,587,589,591,593,595,597],{"class":33,"line":68},[31,583,556],{"class":95},[31,585,586],{"class":78}," v ",[31,588,228],{"class":37},[31,590,569],{"class":116},[31,592,337],{"class":78},[31,594,135],{"class":37},[31,596,576],{"class":78},[31,598,599],{"class":188},"     \u002F\u002F由于是伪随机请自行选择seed来保证更真实的随机\n",[31,601,602,604,607,609,612,614,617,619,622,625,628,630,633,635,637,639,642,644],{"class":33,"line":82},[31,603,556],{"class":95},[31,605,606],{"class":78}," z ",[31,608,228],{"class":37},[31,610,611],{"class":116}," sqrt",[31,613,173],{"class":78},[31,615,616],{"class":37},"-",[31,618,208],{"class":181},[31,620,621],{"class":37}," *",[31,623,624],{"class":116}," log",[31,626,627],{"class":78},"(u)) ",[31,629,135],{"class":37},[31,631,632],{"class":116}," cos",[31,634,173],{"class":78},[31,636,208],{"class":181},[31,638,621],{"class":37},[31,640,641],{"class":78}," M_PI ",[31,643,135],{"class":37},[31,645,646],{"class":78}," v);\n",[31,648,649,652,655,657,660,662],{"class":33,"line":105},[31,650,651],{"class":37},"  return",[31,653,654],{"class":78}," mean ",[31,656,546],{"class":37},[31,658,659],{"class":78}," std ",[31,661,135],{"class":37},[31,663,664],{"class":78}," z;\n",[31,666,667],{"class":33,"line":110},[31,668,475],{"class":78},[10,670,671,672,676,677,680,681,684,685,687],{},"数学原理的描述是这样的：若x1,x2是（0，1）上的均匀分布则y1=(-2",[673,674,675],"em",{},"ln(x1))^.5","cos(2",[673,678,679],{},"pi","x2)和y2=(-2",[673,682,683],{},"ln(x2))^.5","sin(2",[673,686,679],{},"x1)都是标准正态分布的随机数。",[689,690,691],"style",{},"html pre.shiki code .sLXdl, html code.shiki .sLXdl{--shiki-default:#A0111F;--shiki-dark:#F97583;--shiki-sepia:#F92672}html pre.shiki code .sZnmU, html code.shiki .sZnmU{--shiki-default:#032563;--shiki-dark:#9ECBFF;--shiki-sepia:#E6DB74}html pre.shiki code .sfUV7, html code.shiki .sfUV7{--shiki-default:#702C00;--shiki-default-text-decoration:inherit;--shiki-dark:#B392F0;--shiki-dark-text-decoration:inherit;--shiki-sepia:#A6E22E;--shiki-sepia-text-decoration:underline}html pre.shiki code .s0idv, html code.shiki .s0idv{--shiki-default:#0E1116;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2}html pre.shiki code .sGZGq, html code.shiki .sGZGq{--shiki-default:#A0111F;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit;--shiki-sepia:#66D9EF;--shiki-sepia-font-style:italic}html pre.shiki code .scAT4, html code.shiki .scAT4{--shiki-default:#622CBC;--shiki-dark:#B392F0;--shiki-sepia:#A6E22E}html pre.shiki code .sbfHu, html code.shiki .sbfHu{--shiki-default:#702C00;--shiki-default-font-style:inherit;--shiki-dark:#FFAB70;--shiki-dark-font-style:inherit;--shiki-sepia:#FD971F;--shiki-sepia-font-style:italic}html pre.shiki code .stP0Q, html code.shiki .stP0Q{--shiki-default:#023B95;--shiki-dark:#79B8FF;--shiki-sepia:#AE81FF}html pre.shiki code .sZdD5, html code.shiki .sZdD5{--shiki-default:#66707B;--shiki-dark:#6A737D;--shiki-sepia:#88846F}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html.sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}",{"title":27,"searchDepth":45,"depth":53,"links":693},[],"2012-05-03","md",{"layout":697,"status":698,"published":64,"author":699,"author_login":700,"author_email":701,"author_url":702,"wordpress_id":703,"wordpress_url":704,"date_gmt":705,"excerpt":706},"post","publish",{"display_name":700,"login":700,"email":701,"url":702},"chaoshikari","chaoshikari@gmail.com","\u002F",385,"\u002F\u002F?p=385","2012-05-03 14:04:40 +0000",{"type":7,"value":707},[708],[10,709,12],{},"\u002F2012-05-03-c正态随机数生成",{"title":5,"description":12},"_legacy\u002F2012\u002F2012-05-03-c%e6%ad%a3%e6%80%81%e9%9a%8f%e6%9c%ba%e6%95%b0%e7%94%9f%e6%88%90",[714,715],"c++","正态随机","r8mcpglsX_N-G2IEbBh2R1skcjBHQTg7Ka7m8aKYxKU",1788763182008]