<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在C++11之前,我們通常採用rand函數來生成亂數。
但rand函數對一些情況顯得難以處理:
場景描述:
想生成一組整形亂數,放入陣列中,用來測試自己的排序是否正確。
於是我寫出了下方程式碼,生成亂數。
先簡單瞭解下用到的函數:
//返回time_t型別的 當前時間的時間戳 time_t time (time_t* timer); //傳入一個種子,為偽亂數生成器初始化 void srand (unsigned int seed); //得到一個整形偽亂數 int rand (void);
#include <stdio.h> #include <time.h> #include <stdlib.h> int main() { int arr[10] = { 0 }; for (int i = 0; i < 10; ++i) { srand((unsigned int)time(NULL)); //兩個相減是為了出現負的亂數,使測試範圍更廣 arr[i] = (rand() % 100 + 1) - (rand() % 100 + 1); printf("%d ", arr[i]); } return 0; }
我發現儘管我呼叫了srand函數,可生成的陣列值還是同一個。
我思考後想到,因為for迴圈執行速度太快,整個程式都是在一秒內完成的。
所以出現了都是同一個值的情況。
於是我想出了下面的解決方法:
我可以在for迴圈內呼叫Sleep函數,讓我的電腦休眠一下,這樣就不會出現上述情況了。
於是我寫出了下方的程式碼:
#include <stdio.h> #include <time.h> #include <stdlib.h> #include <windows.h> int main() { int arr[10] = { 0 }; for (int i = 0; i < 10; ++i) { Sleep(1000); srand((unsigned int)time(NULL)); arr[i] = (rand() % 100 + 1) - (rand() % 100 + 1); printf("%d ", arr[i]); } return 0; }
通過休眠後,就成功解決問題了。
可是,
如果睡眠時間太短,那麼還是會出現重複的現象;
如果睡眠時間太長,程式執行速度就太慢。
因為上述的原因,我繼續查詢資料,瞭解了rand和srand的基本原理,最終成功解決了該問題。
給srand函數傳入一個數值後,srand會根據這個生成一個隨機序列表(通常有4,294,967,296個數),傳入相同的數生成的序列表是相同的。然後rand從序列的頭部取出一個數返回,然後將這個數放在隨機序列表尾部,因此如果你要取的資料量非常大,是會出現與之前取出的數重複的情況。
此時,上面出現的問題也很好解決了。因為計算機執行速度很快,所以我們每次進入迴圈都會生成一個相同的隨機序列表,rand函數只會取出其第一個數。
要解決這個問題,我們只需要在迴圈前呼叫一次srand函數就好了,這樣就不會重複生成序列表了。
下方是最終形式的程式碼:
#include <stdio.h> #include <time.h> #include <stdlib.h> int main() { int arr[10] = { 0 }; srand((unsigned int)time(NULL)); for (int i = 0; i < 10; ++i) { arr[i] = (rand() % 100 + 1) - (rand() % 100 + 1); printf("%d ", arr[i]); } return 0; }
下文將使用C++11定義在標頭檔案random中的亂數庫通過一組共同作業的類來解決這些問題:亂數引擎類和亂數分佈類。
uniform_int_distribution:產生均勻分佈的整數
template <class IntType = int> class uniform_int_distribution; // IntType // An integer type. Aliased as member type result_type. // By default, this is int.
#include <iostream> #include <random> #include <ctime> using namespace std; int main() { //產生[1, 100]左閉右閉區間的隨機整數 uniform_int_distribution<int> u(1, 100); default_random_engine e; //為亂數引擎設定隨機種子,若不設定每次生成的亂數相同(可以建立時設定) //類似srand的用法,相同的種子生成的亂數相同 //default_random_engine e(time(NULL)); e.seed(time(NULL)); for (size_t i = 0; i < 10; ++i) { cout << u(e) << " "; } cout << endl; return 0; }
uniform_real_distribution:產生均勻分佈的實數
template <class RealType = double> class uniform_real_distribution; // RealType // A floating-point type. Aliased as member type result_type. // By default, this is double.
#include <iostream> #include <random> #include <ctime> using namespace std; int main() { //生成[-1, 1]範圍隨機浮點數 //模板引數只能是浮點型別(float,double, long double) uniform_real_distribution<double> u(-1, 1); default_random_engine e(time(NULL)); for (size_t i = 0; i < 10; ++i) { cout << u(e) << " "; } cout << endl; return 0; }
template <class RealType = double> class normal_distribution;
#include <iostream> #include <random> #include <ctime> using namespace std; int main() { //生成符合均值為10,標準差為2的亂數 normal_distribution<double> u(10, 2); default_random_engine e(time(NULL)); for (size_t i = 1; i <= 100; ++i) { printf("%-9.6lf ", u(e)); if (i % 10 == 0) { cout << endl; } } cout << endl; return 0; }
class bernoulli_distribution;
#include <iostream> #include <random> #include <ctime> using namespace std; int main() { // 生成1的概率為0.7 bernoulli_distribution u(0.7); default_random_engine e(time(NULL)); for (int i = 0; i < 10; i++) { cout << u(e) << " "; } cout << endl; return 0; }
以上就是C++生成隨機浮點數的範例程式碼的詳細內容,更多關於C++隨機浮點數的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45