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