最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++隨機(jī)數(shù)生成實(shí)例講解

 更新時(shí)間:2016年04月13日 15:01:39   投稿:lijiao  
這篇文章主要為大家詳細(xì)介紹了C++隨機(jī)數(shù)生成實(shí)例,如何利用C++來生成0——N-1之間的隨機(jī)數(shù),感興趣的小伙伴們可以參考一下

如果讓你用C++來生成0——N-1之間的隨機(jī)數(shù),你會(huì)怎么做?你可能會(huì)說,很簡單,看:

srand( (unsigned)time( NULL ) );
rand() % N;

仔細(xì)想一下,這個(gè)結(jié)果是隨機(jī)的嗎(當(dāng)然,我們不考慮rand()函數(shù)的偽隨機(jī)性)?
不是的,因?yàn)閞and()的上限是RAND_MAX,而一般情況下,RAND_MAX并不是N的整數(shù)倍,那么如果RAND_MAX % = r,則0——r之間的數(shù)值的概率就要大一些,而r+1——N-1之間的數(shù)值的概率就要小一些。還有,如果N > RAND_MAX,那該怎么辦?
下面給出一種比較合適的方案,可以生成任意范圍內(nèi)的等概率隨機(jī)數(shù) result。最后還有一個(gè)更簡單的方法。
1、如果N<RAND_MAX+1,則要去除尾數(shù),       

 R = RAND_MAX-(RAND_MAX+1)%N; //去除尾數(shù)
  t = rand();
  while( t > R ) t = rand();
  result = t % N; // 符合要求的隨機(jī)數(shù)

2、如果 N>RAND_MAX,可以考慮分段抽樣,分成[n/(RNAD_MAX+1)]段,先等概率得到段再得到每段內(nèi)的某個(gè)元素,這樣分段也類似地有一個(gè)尾數(shù)問題,不是每次都剛好分到整數(shù)段,一定或多或少有一個(gè)余數(shù)段,這部分的值如何選???

選到余數(shù)段的數(shù)據(jù)拿出來選取,先進(jìn)行一次選到余數(shù)段概率的事件發(fā)生,然后進(jìn)行單獨(dú)選?。?nbsp;     

 r = N % (RAND_MAX+1); //余數(shù)
  if ( happened( (double)r/N ) )//選到余數(shù)段的概率
  result = N-r+myrandom(r); // myrandom可以用情況1中的代碼實(shí)現(xiàn)
  else
  result = rand()+myrandom(N/(RAND_MAX+1))*(RAND_MAX+1); // 如果選不到余數(shù)段再進(jìn)行分段選取

完整的代碼:

#include<iostream.h>
#include<time.h>
#include<stdlib.h>
const double MinProb=1.0/(RAND_MAX+1);
bool happened(double probability)//probability 0~1
{
 if(probability<=0)
 {
return false;
 }
 if(probability<MinProb)
 {
 return rand()==0&&happened(probability*(RAND_MAX+1));
 }
 if(rand()<=probability*(RAND_MAX+1))
 {
 return true;
 }
 return false;
}
long myrandom(long n)//產(chǎn)生0~n-1之間的等概率隨機(jī)數(shù)
{
 t=0;
 if(n<=RAND_MAX)
 {
 long R=RAND_MAX-(RAND_MAX+1)%n;//尾數(shù)
 t = rand();
 while ( t > r )
 {
  t = rand();
 }
 return t % n;
 }
 else
 {
 long r = n%(RAND_MAX+1);//余數(shù)
 if( happened( (double)r/n ) )//取到余數(shù)的概率
 {
  return n-r+myrandom(r);
 }
 else
 {
  return rand()+myrandom(n/(RAND_MAX+1))*(RAND_MAX+1);
 }
 }
}
 
還有另外一種非常簡單的方式,那就是使用
random_shuffle( RandomAccessIterator _First, RandomAccessIterator _Last ).
例如,生成0——N-1之間的隨機(jī)數(shù),可以這么寫
#include <algorithm>
#include <vector>
long myrandom( long N )
{
 std::vector<long> vl( N ); // 定義一個(gè)大小為N的vector
 for ( long i=0; i<N; ++i )
 {
  vl[i] = i;
 }
 std::random_shuffle( vl.begin(), vl.end() );
 return (*vl.begin());
}
random_shuffle 還有一個(gè)三參數(shù)的重載版本
random_shuffle( RandomAccessIterator _First, RandomAccessIterator _Last, RandomNumberGenerator& _Rand )

第三個(gè)參數(shù)可以接受一個(gè)自定義的隨機(jī)數(shù)生成器來把前兩個(gè)參數(shù)之間的元素隨機(jī)化。
這個(gè)方法的缺陷就是,如果只是需要一個(gè)隨機(jī)數(shù)的話,當(dāng)N很大時(shí),空間消耗很大!

相關(guān)文章

  • Qt實(shí)現(xiàn)可拖動(dòng)按鈕

    Qt實(shí)現(xiàn)可拖動(dòng)按鈕

    這篇文章主要為大家詳細(xì)介紹了Qt實(shí)現(xiàn)可拖動(dòng)按鈕,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-08-08
  • C++中內(nèi)存分區(qū)及其作用分析

    C++中內(nèi)存分區(qū)及其作用分析

    C++內(nèi)存分區(qū)包括棧區(qū)、堆區(qū)、全局靜態(tài)區(qū)、常量區(qū),各自負(fù)責(zé)不同的數(shù)據(jù)存儲(chǔ)和回收,棧區(qū)主要用于存放函數(shù)局部變量和參數(shù),堆區(qū)用于動(dòng)態(tài)分配內(nèi)存,全局靜態(tài)區(qū)用于存放全局靜態(tài)變量和靜態(tài)成員變量,常量區(qū)用于存放常量和字符串常量
    2023-04-04
  • Qt5.9實(shí)現(xiàn)簡單復(fù)合圖形

    Qt5.9實(shí)現(xiàn)簡單復(fù)合圖形

    這篇文章主要為大家詳細(xì)介紹了Qt5.9實(shí)現(xiàn)簡單復(fù)合圖形,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • 深入解析C++ STL中的常用容器

    深入解析C++ STL中的常用容器

    這里我們不涉及容器的基本操作之類,只是要討論一下各個(gè)容器其各自的特點(diǎn)。STL中的常用容器包括:順序性容器(vector、deque、list)、關(guān)聯(lián)容器(map、set)、容器適配器(queue、stac)
    2013-09-09
  • C/C++預(yù)處理淺析使用形式

    C/C++預(yù)處理淺析使用形式

    預(yù)處理是指在進(jìn)行編譯的詞法掃描和語法分析之前所作的工作。預(yù)處理指令指示在程序正式編譯前就由編譯器進(jìn)行的操作,可放在程序中任何位置。處理完畢自動(dòng)進(jìn)入對(duì)源程序的編譯。C/C++中的預(yù)處理主要包含三種:文件包含、宏定義、條件編譯
    2022-09-09
  • 解決C++ openCV無法讀取視頻但是可以讀取圖像的問題記錄

    解決C++ openCV無法讀取視頻但是可以讀取圖像的問題記錄

    在使用OpenCV的cv::VideoCapture讀取視頻文件時(shí),可能會(huì)遇到無法讀取特定格式,如MP4的視頻文件的問題,本文介紹解決C++ openCV無法讀取視頻但是可以讀取圖像的問題記錄,感興趣的朋友跟隨小編一起看看吧
    2024-09-09
  • C語言實(shí)現(xiàn)簡單的<三子棋>案例

    C語言實(shí)現(xiàn)簡單的<三子棋>案例

    這篇文章主要介紹了C語言實(shí)現(xiàn)簡單的《三子棋》,本文通過功能區(qū)分一步步實(shí)現(xiàn)該案例,通過逐步的解析和代碼列舉,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C語言中的搜索算法詳細(xì)解讀

    C語言中的搜索算法詳細(xì)解讀

    這篇文章主要介紹了C語言中的搜索算法詳細(xì)解讀,如果用樹構(gòu)建一個(gè)搜索樹,層層搜索關(guān)鍵字(的一個(gè)字母),搜索到后就是需要的描述,就會(huì)節(jié)約很多時(shí)間,需要的朋友可以參考下
    2023-10-10
  • 基于堆的基本操作的介紹

    基于堆的基本操作的介紹

    本篇文章對(duì)堆的基本操作進(jìn)行了詳細(xì)的分析介紹。需要的朋友參考下
    2013-05-05
  • 詳解C++ new-handler機(jī)制

    詳解C++ new-handler機(jī)制

    這篇文章主要介紹了C++ new-handler機(jī)制的相關(guān)資料,幫助大家更好的理解和使用c++,感興趣的朋友可以了解下
    2020-11-11

最新評(píng)論

峡江县| 凤阳县| 页游| 锡林郭勒盟| 北海市| 娄烦县| 南昌县| 绍兴县| 柘城县| 和静县| 河东区| 英超| 二连浩特市| 上犹县| 浦北县| 梅州市| 江口县| 梁河县| 新丰县| 靖安县| 光泽县| 乐昌市| 鄂尔多斯市| 永川市| 闽清县| 五台县| 彭水| 高要市| 寻乌县| 博乐市| 乳源| 炉霍县| 西丰县| 马公市| 江陵县| 公安县| 星座| 宣恩县| 房山区| 沂源县| 崇信县|