日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C/C++ 中生成特定范围内的随机数

發(fā)布時間:2025/3/21 c/c++ 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C/C++ 中生成特定范围内的随机数 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

大家在寫 C/C++ 程序時,難免會遇到要求獲取某個范圍內(nèi)的隨機數(shù),我查閱了一些資料后,總結(jié)如下。本文分兩部分,先介紹 C 語言中與隨機數(shù)相關(guān)的兩個函數(shù) srand 和 rand,后介紹 C++ 中的 random 庫,每一部分最后會給出生成特定范圍內(nèi)的隨機數(shù)模板供參考。


1 C 語言中的 srand 和 rand


1.1 實現(xiàn)

下面是 VC 的實現(xiàn),GCC 的實現(xiàn)比 VC 的復(fù)雜,但基本原理是一樣的。 [cpp] view plaincopyprint?
  • #define?RAND_MAX?32767??//?in?<stdlib.h>??
  • ??
  • unsigned?long?_Randseed?=?1;????//?global?seed??
  • ??
  • void?srand(unsigned?int?seed)?{??
  • ????_Randseed?=?seed;??
  • }??
  • ??
  • int?rand(void)?{??
  • ????_Randseed?=?_Randseed?*?1103515245?+?12345;??
  • ??
  • ????return?((unsigned?int)(_Randseed?>>?16)?&?RAND_MAX);??
  • }??
  • 第一次接觸 C 語言中的隨機數(shù)時,很疑惑為什么有種子這個玩意,只提供一個產(chǎn)生隨機數(shù)的函數(shù)不就行了嗎,看了上面的源碼后,就明白了,因為計算機不能產(chǎn)生真正的隨機數(shù),只能靠數(shù)學(xué)的方法產(chǎn)生偽隨機數(shù)。srand 函數(shù)的作用是設(shè)置種子,如果不設(shè)置的話種子(上面的 _Randseed)則默認(rèn)初始是1,種子是全局變量。rand 的實現(xiàn)就跟數(shù)論有關(guān)了,上面的實現(xiàn)用的是線性同余法。可以看到它的返回值范圍是 [0, RAND_MAX]。


    1.2 time

    既然計算機不能產(chǎn)生真正的隨機數(shù),那怎么才能使程序每次運行的結(jié)果不同呢?總得有個隨機的東西,那就借助 time 這個函數(shù)產(chǎn)生種子,引入一個新東西又會帶來一些坑,我早年寫過這種程序:

    [cpp] view plaincopyprint?
  • //?生成十個隨機數(shù)(錯誤用法)??
  • for?(int?i?=?0;?i?<?10;?++i)?{??
  • ????srand((unsigned?int)time(NULL));??
  • ????printf("%d:?%d\n",?i,?rand());??
  • }??
  • 它將產(chǎn)生10個相同的數(shù)。要解釋這個問題,就得弄懂 time 這個函數(shù),它的函數(shù)原型如下: [cpp] view plaincopyprint?
  • time_t?time(time_t?*timer);??
  • 它返回“當(dāng)前時間”,這個“時間“的類型是 time_t,在 VC 中被 typedef 為 unsigned long,標(biāo)準(zhǔn)中只規(guī)定它是個算數(shù)類型,至于它是如何表示時間的未定義。一般是返回?UNIX 時間戳,定義為從格林威治時間1970年01月01日00時00分00秒起至現(xiàn)在的總秒數(shù)。上面的程序執(zhí)行時很快,在一秒內(nèi)完成循環(huán),所以它產(chǎn)生了相同的隨機數(shù)。


    1.3 my rand

    下面提供兩個生成隨機數(shù)的模板。

    [cpp] view plaincopyprint?
  • int?g_is_first?=?1;??
  • ??
  • /*?
  • **?return?a?random?integer?in?the?interval?
  • **?[a,?b]?
  • */??
  • int?uniform_int(int?a,?int?b)?{??
  • ????if?(g_is_first)?{??
  • ????????g_is_first?=?0;??
  • ????????srand((unsigned?int)time(NULL));??
  • ????}??
  • ??
  • ????return?(int)((double)rand()?/?((RAND_MAX?+?1.0)?/?(b?-?a?+?1.0))?+?a);??
  • }??
  • ??
  • /*?
  • **?return?a?random?real?in?the?interval?
  • **?[a,?b]?(also?[a,?b))?
  • */??
  • double?uniform_real(double?a,?double?b)?{??
  • ????if?(g_is_first)?{??
  • ????????g_is_first?=?0;??
  • ????????srand((unsigned?int)time(NULL));??
  • ????}??
  • ??
  • ????return?(double)rand()?/?((double)RAND_MAX?/?(b?-?a))?+?a;??
  • }??
  • 為了保證 srand 函數(shù)只執(zhí)行一次,這里用了全局標(biāo)志 g_is_first。其實最好在頭文件中定義接口,在源文件中實現(xiàn),這里為了使用方便就全放一起了。當(dāng)要求的隨機數(shù)范圍過大時,uniform_int 和 uniform_real 貌似有 bug。


    2 C++ 中的 random 庫


    在 random 庫中有隨機數(shù)發(fā)生器(random engine/generator)和分布(distribution),它們的具體用法我就不在這說了。我個人認(rèn)為 engine 存儲了種子,將 C 語言中的全局種子封裝起來了。uniform distribution 中只存儲了最大值和最小值(即平均分布的兩個參數(shù))。還有個真正的 engine 叫 std::random_device,它根據(jù)機器的各種實時參數(shù)產(chǎn)生隨機數(shù),標(biāo)準(zhǔn)規(guī)定它的實現(xiàn)是可選的,有的編譯器(如 MinGW)目前不支持,產(chǎn)生的還是偽隨機數(shù),不過?VC 及?Linux 平臺上的 GCC?是支持的,下面的程序假設(shè)用戶的編譯器支持。 [cpp] view plaincopyprint?
  • /*?
  • **?return?a?random?integer?in?the?interval?[a,?b]?
  • */??
  • int?uniform_int(int?a,?int?b)?{??
  • ????static?std::default_random_engine?e{std::random_device{}()};?//?avoid?"Most?vexing?parse"??
  • ????static?std::uniform_int_distribution<int>?u;??
  • ??
  • ????return?u(e,?decltype(u)::param_type(a,?b));??
  • }??
  • ??
  • /*?
  • **?return?a?random?real?in?the?interval?[a,?b]?(also?[a,?b))?
  • */??
  • double?uniform_real(double?a,?double?b)?{??
  • ????static?std::default_random_engine?e{std::random_device{}()};??
  • ????static?std::uniform_real_distribution<double>?u;??
  • ??
  • ????return?u(e,?decltype(u)::param_type(a,?b));??
  • }??
  • 最后,還有個問題沒搞懂:能否始終用 random_device 代替 default_random_engine ?它們的區(qū)別是什么?

    參考資料

    [1] C 標(biāo)準(zhǔn)庫 [2] C 和指針 [3] 隨機數(shù)是騙人的,.Net、Java、C為我作證 [4]?How to generate a random number in C? [5]?Generate random numbers uniformly over an entire range [6]?Generate a random number within range? [7]?C++ random float number generation [8] C++ Primer [9]?How to make sure a function is only called once


    from: http://blog.csdn.net/Justme0/article/details/41547761

    總結(jié)

    以上是生活随笔為你收集整理的C/C++ 中生成特定范围内的随机数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 精品人妻伦九区久久aaa片 | 在线色资源 | 欧美国产精品一二三 | av片免费观看 | 日韩三级久久 | 可乐操亚洲 | 在线观看精品一区 | 国产精品久久久久久无人区 | 男女午夜影院 | 无套内谢的新婚少妇国语播放 | 国产青青在线 | 插插插插综合 | 日本后进式猛烈xx00动态图 | 卡一卡二卡三 | 免费在线播放av | 户外少妇对白啪啪野战 | 91免费在线视频观看 | 超碰caoprom| 四虎网址在线 | 欧洲精品在线播放 | 日韩欧美在线观看一区 | 国产xxx| 雷电将军和丘丘人繁衍后代视频 | 精品综合 | 韩国伦理电影免费在线 | eeuss国产一区二区三区黑人 | a天堂在线资源 | 中国免费毛片 | 亚洲av无码专区在线 | 国产免费一级片 | 亚洲精品乱码久久 | 2019中文字幕在线免费观看 | 久久aⅴ国产欧美74aaa | 亚洲字幕在线观看 | 五月天狠狠操 | 国产一级特黄aaa大片 | 韩国黄色网 | 欧美bdsm调教视频 | 日本少妇一区二区三区 | 欧美日韩aa | 欧洲-级毛片内射 | 精品一区二区久久久久蜜桃 | 少妇精品一区二区三区 | 国产成人精品一区二区三区网站观看 | 国产精品剧情一区 | 久久午夜剧场 | 亚洲精品高清视频在线观看 | 日本性爱动漫 | 国产精品后入内射日本在线观看 | 日韩av在线播放观看 | 又爽av| mm131美女大尺度私密照尤果 | 成人免费视频一区二区三区 | 在线观看国产 | 日韩在线综合 | 小妹色播| 户外少妇对白啪啪野战 | 老司机深夜福利在线观看 | 国产免费自拍视频 | 91视频啊啊啊 | 国产欧美日韩二区 | 日韩欧美视频免费观看 | 污网站免费在线观看 | wwwwyoujizzcom| 色婷婷一区二区 | 无码精品人妻一二三区红粉影视 | 国产一区二区三区三州 | 美国伊人网 | 五月激情开心网 | 男女性高潮免费网站 | 国产让女高潮的av毛片 | 肉肉视频在线观看 | 懂色一区二区 | 成人福利在线观看 | 亚洲成a| 操操操爽爽爽 | 337p粉嫩大胆色噜噜狠狠图片 | 先锋资源一区 | 中文字幕无码av波多野吉衣 | 国产精品夜夜爽张柏芝 | 日韩精品一区二区三区丰满 | 久久国产精品久久久久久 | aaa毛片视频| a视频在线免费观看 | 神马久久网站 | 欧美人与动性xxxxx杂性 | 影音先锋亚洲资源 | 一级片a级片 | 超碰日韩在线 | 亚洲无码精品在线观看 | 草久久久久 | 色小说在线观看 | 国产第页| 超碰77| 国产精品乱码一区二三区小蝌蚪 | a色视频| 欧美激情免费在线 | 久久99国产精品久久99 | 天天操天天干天天插 |