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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

随机值获取—random

發布時間:2023/12/31 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 随机值获取—random 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

如何利用?random?庫中的組件生成符合條件的隨機數。

隨機數引擎類是可以獨立運行的隨機數發生器,它以均勻的概率生成某一類型的隨機數,但無法指定隨機數的范圍、概率等信息。因此,它也被稱為“原始隨機數發生器”,由于不能指定生成隨機數的范圍,它通常不會被單獨使用。

隨機數分布類是一個需要于隨機數引擎類的支持才能運行的類,但是它能根據用戶的需求利用隨機數引擎生成符合條件的隨機數,例如某一區間、某一分布概率的隨機數。

?

隨機數引擎類都支持的操作如下:

名稱功能
Engine e創建一個引擎。
Engine e(s)創建一個引擎,并用 s 作為種子。
e.seed(s)使用種子 s 充值 e 的狀態。
e.min( ), e.max( )e 能生成的最小值和最大值。
e.discard(u)將 e 推進 u 步(u 的類型為 unsigned long long)。

隨機數分布類共有的操作:

名稱功能
U u創建一個分布類 u 。
u(e)用隨機數引擎 e 生成隨機數(u 代表隨機數分布類)。
u.min( )u 能生成的最小值。
u.max( )u 能生成的最大值。
u.reset( )重置 u 的狀態,使隨后 u 生成的值不受之前的值影響 。

隨機非負數——default_random_engine


default_random_engine 是一個隨機數引擎類。它定義的調用運算符返回一個隨機的 unsigned 類型的值。

因此,若想生成 10 個隨機非負數并輸出,程序可以這么寫:

#include <iostream> #include <random> using namespace std; int main( ){ default_random_engine e; for(int i=0; i<10; ++i) cout<<e( )<<endl; return 0; }

在我們的系統中,測試結果為:

16807 282475249 1622650073 984943658 1144108930 470211272 101027544 1457850878 1458777923 2007237709

可以看出,還是比較“隨機”的。

當然,default_random_engine 也只是一個偽隨機數發生器,如果在運行一次程序,得到結果將還是這幾個數。

若想令每次運行程序時的生成結果不同,可以為其設置較為隨機的種子,比如當前系統的時間。

特定范圍的非負數——uniform_int_distribution


uniform_int_distribution 是一個隨機數分布類,也是個模板類,模板參數為生成隨機數的類型(不過只能是 int、unsigned、short、unsigned short、long、unsigned long、long long、unsigned long long 中的一種)。它的構造函數接受兩個值,表示隨機數的分布范圍(閉區間)。

因此,一個生成 0 到 9 的隨機數程序可以這么寫:

#include <iostream> #include <random> using namespace std; int main( ){ default_random_engine e; uniform_int_distribution<unsigned> u(0, 9); for(int i=0; i<10; ++i) cout<<u(e)<<endl; return 0; }

在我們的系統中,它的生成結果為:

0 1 7 4 5 2 0 6 6 9

隨機浮點數——uniform_real_distribution


uniform_real_distribution 是一個隨機數分布類,它也是模板類,參數表示隨機數類型(可選類型為 float、double、long double)。構造函數也需要最大值和最小值作為參數。

下面是一個生成 10 個 0~1 之間的隨機浮點數的例子:

#include <iostream> #include <random> using namespace std; int main( ){ default_random_engine e; uniform_real_distribution<double> u(0.0, 1.0); for(int i=0; i<10; ++i) cout<<u(e)<<endl; return 0; }

在我們的系統上的結果為:

0.131538 0.45865 0.218959 0.678865 0.934693 0.519416 0.0345721 0.5297 0.00769819 0.0668422

隨機布爾值——bernoulli_distribution


bernoulli_distribution 是一個分布類,但它不是模板類。它的構造函數只有一個參數,表示該類返回 true 的概率,該參數默認為 0.5 ,即返回 true 和 false 的概率相等。

下面是一個生成 10 個隨機布爾值的例子:

#include <iostream> #include <random> using namespace std; int main( ){ default_random_engine e; bernoulli_distribution u; for(int i=0; i<10; ++i) cout<<u(e)<<endl; return 0; }

在我們的系統上的結果為:

1 1 1 0 0 0 1 0 1 1

總結


常用的隨機數類如下:

  • default_random_engine:隨機非負數(不建議單獨使用)。
  • uniform_int_distribution:指定范圍的隨機非負數。
  • uniform_real_distribution:指定范圍的隨機實數。
  • bernoulli_distribution:指定概率的隨機布爾值。

事實上,random 庫的功能極其豐富,其中的隨機數引擎不止有 default_random_engine 一個,分布類也遠遠不止上述三個。它還能進行泊松分布、正態分布、抽樣分等高級的隨機數功能,想詳細了解這些內容請去查閱其他資料。我可能要等好久才能把這些內容補上。

C++11中的random類

random類是C++11中增加的類,該類可以用于生成隨機數,具有C語言中rand生成偽隨機數的功能,但其功能更強大。原生支持生成浮點數,及分布類。?

隨機數發生器主要由分布對象和隨機數引擎對象組成。其中隨機數引擎用于根據隨機數種子來產生隨機數,分布對象對產生的隨機數根據需求進行分布。
random中定義了多種隨機數引擎及分布類型,常用的引擎是默認偽隨機數引擎類default_random_engine,常用的分布類有產生整型分布的uniform_int_distribution,產生浮點型的分布uniform_real_distribution。?

舉例

該程序輸出15個double類型的隨機數

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <random>
#include <iostream>
#include <ctime>

//該函數接受三個參數分別指定隨機數范圍和種子,返回double
double random_unint(unsigned int min, unsigned int max, unsigned int seed = 0)
{
static std::default_random_engine e(seed);
static std::uniform_real_distribution<double> u(min, max);
return u(e);
}

int main(void)
{
for (int i = 0; i < 15; ++i) {
std::cout << random_unint(0, 15, time(NULL)) << " ";
}
std::cout << std::endl;
return 0;
}

?

需要注意

1.一個給定的隨機數發生器一直會生成相同的隨機數序列。一個函數如果定義了局部的隨機數發生器,應該將其(包括引擎和分布對象)定義為static的,否則每次調用函數都會生成相同的序列。也就是說定義成static后每次調用還是之前那個發生器,第一次調用產生一批隨機數,再次調用將產生接下來的隨機數,否則每次調用產生的都是最前面的那些隨機數。

2.依然需要使用time來做為種子產生每個不同時刻都不同的隨機序列,但由于time默認返回的是以秒計的時間,所以有可能多次使用的都是相同的種子。?

偽隨機數引擎

1.隨機數引擎支持的操作如下:?

  • Engine e; //默認構造函數,使用該引擎類型的默認種子
  • Engine e(s); //使用整型s做為種子
  • e.seed(s); //使用整型s重置引擎狀態
  • e.min(); //返回此引擎所能生成的最小和最大值
  • e.max();
  • Engine::result_type //此引擎生成的類型(unsigned)
  • e.discard(u); //將引擎推進u步,u為unsigned long long類型?

2.隨機數引擎使用

1
2
std::default_random_engine e; //生成隨機的無符號數
std::cout << e(); //通過()調用對象生成下一個隨機數并輸出

作者:zhaosiyi
鏈接:https://www.jianshu.com/p/05863a00af8d
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。

轉載于:https://www.cnblogs.com/xiaofeiIDO/p/8581178.html

總結

以上是生活随笔為你收集整理的随机值获取—random的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。