青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

S.l.e!ep.¢%

像打了激速一樣,以四倍的速度運轉,開心的工作
簡單、開放、平等的公司文化;尊重個性、自由與個人價值;
posts - 1098, comments - 335, trackbacks - 0, articles - 1
  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理
2009-03-19 12:42
如何產生不重復的隨機數?最容易想到的方法,是逐個產生這些隨機數,每產生一個,都跟前面的隨機

數比較,如果重復,就重新產生。這是個很笨的方法,且比較次數呈線性增長,越往后次數越多。其實這些

比較是多余的,完全可以不進行比較,只要反過來,按順序產生這些數,但隨機產生它們的位置。例如下

面產生100個100以內不重復隨機數的代碼:

int a[100];
for(i=0; i<=99; ++i) a[i]=i;
for(i=99; i>=1; --i) swap(a[i], a[rand()%i]);

上面這段代碼只需要遍歷一次就可以產生這100個不重復的隨機數,它是如何做到的呢?首先第二行按順

序用0到99填滿整個數組;第三行,是隨機產生從0到m-2個數組下標,把這個下標的元素值跟m-1下標的元

素值交換,一直進行到下標為1的元素。因此它只需要遍歷一次就能產生全部的隨機數。

??????? 再看下面的代碼,原理跟上面例子相似,但效率比上面的差點,但仍不失為一個好方法:

int a[100]={0};
int i, m;
for(i=1; i<=99; ++i)
{
??????? while(a[m=rand()%100]);
??????? a[m] = i;
}

這段代碼也是隨機產生位置,但它預先把整個數組初始化為0,然后隨機產生其中一個位置,如果該元素

值為0,表示這個位置還沒有被使用過,就把i賦予它;否則,就重新隨機產生另一個位置,直到整個數組

被填滿。這個方法,越到后面,遇到已使用過的元素的可能性越高,重復次數就越多,這是不及第一個方

法的地方,但總的來說,效率還是不錯的。

===================================================================================

1.產生一個隨機數(從0到32767)
?? srand((unsigned) time(NULL)); //為了提高不重復的概率
?? rand(); //產生隨機數

2.產生從m到n的隨機數(包括m,不包括n)
?? srand((unsigned) time(NULL)); //為了提高不重復的概率
?? rand()%(n - m + 1) + m;??????????????? //使用時將m和n換為具體數即可

==================================================================================

問題的來由 - "隨機取m個數(在1到n的范圍之內),(m <= n),要求m個數沒有重復。有沒有
什么好的算法,時間復雜度和空間復雜度都很好"

----------------------------------------------------------------
方案一:
取隨機數可以用C++標準的rand,至于M個不重復,你可以用std::set來解決,把取道的隨機數
插入到set里面,set的size() == m就可以了, 具體可以這樣:

#include <set>
#include <stdlib.h>

int main()
{
?? std::set<int> s;
?? while(1)
?? {
????? int r = rand() % n;
????? s.insert(r);
????? if(s.size() == m)
????? {
???????? break;
????? }
?? }
}

由于set底層實現是紅黑樹,插入復雜度是對數級的^_^

----------------------------------------------------------------
方案二:
#include <iostream>
#include <cstdlib>????? //用于rand()和srand()函數
#include <ctime>??????? //設置不同的隨機數

using namespace std;

int main (){
??? srand( time( 0 ) );??? //調用不重復的隨機數函數
??? unsigned i;
??? for ( int n = 0; n++ < 10; )
??? {
??????? i = rand() ;??????? //對i 賦系統的隨機數
??????? cout << " The NO." << n << "is : " << i << endl;
??? }

??? return 0;
}

1. C++標準函數庫提供一隨機數生成器rand,返回0-RAND_MAX之間均勻分布的偽隨機整數。 RAND_MAX
?? 必須至少為32767。rand()函數不接受參數,默認以1為種子(即起始值)。

?? 隨機數生成器總是以相同的種子開始,所以形成的偽隨機數列也相同。失去了隨機意義。

2. C++中另一函數srand(),可以指定不同的數(無符號整數變元)為種子。但是如果種子相同,偽
?? 隨機數列也相同。--一個辦法是讓用戶輸入種子,但是仍然不理想。

3. 比較理想的是用變化的數,比如時間來作為隨機數生成器的種子。
?? 在 頭文件ctime中時間庫包含time函數,它可以返回一個表示時間、日期、月和年的數值使用如
?? 下調用可將該值設為rand的種子
?? srand(static_cast<unsigned>(time(static_cast<time_t*>(NULL))));

4. 但, srand()并不是說使隨機數都不一樣,它只是使取隨機數的種子隨著時間而改變:)
?? So, 還是方案一好!

===============================================================================

生成無重復的隨機數,注意,是不重復的序列.
?? 通常的生成隨機數的做法是不考慮重復的,因為即使重復也屬于概率意義上的正常情況.但某些情況下需要不重復的隨機數據,怎么辦呢?
?? 我想從大方向上來說,應該只有兩個方法.要么犧牲時間要么犧牲空間.講得不對或不完整,大家一定要指出來啊,謝謝.

??????????????????????????? =---------------來源CSDN

??注意,下面均以在101~200的范圍內(設為b[100],它實際上是附加空間),從中產生10個不重復的隨機數(設為a[10]).
??
一.犧牲時間為代價
?? 這種方法不需要附加空間b數組.
?? 要產生一定范圍內不可重復的隨機數,把曾經生成的隨機數保存起來作為歷史數據。產生一個新的隨機數后在歷史數據搜索,若找到就重新產生一個新的再重復數據搜索;否則就認為已經找到了一個新的不同隨機數。
?? 可以預見,每個新產生的隨機數都要與前面所有的數比較.若重復,舍棄,再產生;否則,產生下一個.平均耗時n的平方量級.
?? 粗看起來,上面的程序似乎沒有什么問題,在執行過程中程序也能夠通過。但,仔細分析我們就會發現問題出在一個新產生的隨機數是否已經存在的判定上。既然是隨機數,那么從數學的角度來說在概率上,每次產生的隨機數 r就有可能相同,盡管這種可能性很小,但確是一個邏輯性與正確性的問題。因此,每次產生的新的隨機數r都有可能是數組random的前i-1個數中的某一個,也就是說程序在運行過程中由此可能會導致死循環!
??? 有人可能會爭辯說,這種概率很小嘛,幾乎為零.的確,但我要問,算法的五大特性是什么,其中兩大特性就是:確定性和有窮性.
??? 所以,怎么解決?犧牲空間.(稍后介紹)

二.犧牲空間為代價
?? 以下方法需要附加空間b數組.
?? (1)將范圍數組b[100](b[i]=100+i,不妨設數組下標從1開始)的每個元素設置一個標志位flag.初始均為flag=0;若某元素被選入到a數組中,則flag=1;顯然,以后再選到重復元素可以立刻判定是否已選.這不正是以空間換時間嗎?
?? 但是仍然有一個很嚴重的問題,在小規模輸入下,無疑它的表現是不錯的.但現在舉一個失敗的例子.
?? 在1~65536之間,選擇65500個不重復的隨機數.看看后面的隨機數,比如第65500個數(最后一個),它要在剩下的36個數中選擇才會有flag=0(根本不知道這36個數是什么);哼哼,概率36/65536.越到后面,隨機數越難產生,空間也換不了時間.
?? 改進:先在1~65536之間隨機選取36個數,刪除.將剩下的65500個數依次賦值給a[65500],然后打亂順序即可,如下偽碼:

1fori ← 1to length[a]
2???doj ← random() //隨機產生一個a數組的下標

3?????? exchange a[i]←→a[j]//交換a[i]與a[j]
4

當范圍數組與目標數組的大小非常接近時,上述算法非常有效,建議采用.

(2)問題的最終解決.
?? 仍以最開始的那個例子來說,初始數組b[i]=100+i,a數組空.
?? 每次隨機生成數組b的一個下標subscript,然后取出它所對應的數據a[subscript],記下來.然后將數組b的最后一個數b[length]放到下標subscript的位置,同時將數組a長度減1。盡管前若干次生成的下標subscript隨機數有可能相同,但,因為每一次都把最后一個數填到取出的位置,因此,相同下標subscript對應的數卻絕不會相同,每一次取出的數都不會一樣,這樣,就保證了算法的確定性、有效性、有窮性.
偽碼算法如下:

1lower ← 101
2upper ← 200
3fori ← 1to upper-lower+1
4????dob[i]=lower+i-1
5fori←1to length[a]
6????dosubscript =(int)(length[b]*Rnd +lower)//隨機產生b數組的一個下標,Rnd產生0~1隨機數

7??????? temp ← b[subscript]
8
??????? b[subscript] ← b[length[b]]
9??????? length[b]--
;
10??????? a[i]=
temp;
11
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲免费在线看| 国产欧美 在线欧美| 亚洲精品久久视频| 国产精品99久久久久久久久久久久 | 亚洲国产精品成人| 欧美aa在线视频| 校园春色国产精品| 蜜臀av性久久久久蜜臀aⅴ| 亚洲欧美日韩国产综合精品二区| 久久精品国产久精国产思思| 亚洲午夜在线观看视频在线| 久久国产精品久久久| 中文av字幕一区| 免费欧美高清视频| 裸体丰满少妇做受久久99精品| 欧美日韩a区| 日韩视频精品| 99视频在线精品国自产拍免费观看| 精品av久久久久电影| 久久国产精品久久w女人spa| 欧美一级专区| 国产又爽又黄的激情精品视频| 一道本一区二区| 欧美日韩国产一级| 亚洲大片在线观看| 亚洲精品久久久久久久久| 久久亚洲精品欧美| 麻豆精品一区二区综合av| 一区二区三区精品久久久| 亚洲深夜激情| 欧美.日韩.国产.一区.二区| 噜噜噜91成人网| 国产精品久久久久9999吃药| 一本大道久久a久久精二百| 亚洲第一在线视频| 久久电影一区| 亚洲欧美日韩人成在线播放| 一区二区三区国产| 久久久久久9| 国产精品a久久久久| 欧美va亚洲va香蕉在线| 国产精品午夜av在线| 亚洲大胆女人| 国色天香一区二区| 亚洲一区二区成人在线观看| 日韩一级大片| 免费成人av在线看| 另类春色校园亚洲| 国产亚洲欧美日韩一区二区| 亚洲综合国产| 亚洲欧美美女| 欧美视频一区二区在线观看 | 久久久久久自在自线| 欧美日韩精品中文字幕| 欧美激情一区二区三区全黄| 一区在线播放视频| 久久久久www| 免费h精品视频在线播放| 国产视频在线一区二区 | 日韩写真在线| 在线午夜精品| 欧美少妇一区二区| 一区二区三区产品免费精品久久75| 日韩午夜精品视频| 欧美日韩国产成人| 亚洲精品色婷婷福利天堂| 亚洲精品一二区| 欧美成人免费观看| 亚洲美女在线国产| 亚洲天堂av在线免费观看| 欧美日韩国产美| 亚洲图片在区色| 午夜视频久久久| 国产欧美精品一区| 久久久午夜电影| 黄色精品网站| 欧美 日韩 国产精品免费观看| 欧美777四色影视在线| 亚洲国产精品悠悠久久琪琪| 欧美成人xxx| 日韩性生活视频| 久久成人在线| 亚洲风情亚aⅴ在线发布| 欧美成人亚洲| 亚洲视频在线播放| 欧美中在线观看| 亚洲高清资源| 欧美视频在线免费看| 香蕉久久国产| 欧美电影免费观看| 亚洲一区二区日本| 黑丝一区二区| 欧美日韩高清在线| 一本色道久久综合精品竹菊| 欧美伊人精品成人久久综合97 | 欧美日韩国产经典色站一区二区三区| 亚洲日本在线视频观看| 亚洲精品乱码久久久久久蜜桃麻豆| 欧美日韩国产一区精品一区| 亚洲女女做受ⅹxx高潮| 欧美高清不卡在线| 亚洲欧美欧美一区二区三区| 影院欧美亚洲| 国产精品xnxxcom| 久久天天躁狠狠躁夜夜av| 亚洲精品日产精品乱码不卡| 久久久久五月天| 一区二区三区四区蜜桃| 精品91在线| 国产精品超碰97尤物18| 毛片一区二区| 性亚洲最疯狂xxxx高清| 91久久国产精品91久久性色| 性伦欧美刺激片在线观看| 亚洲激情综合| 精品91久久久久| 国产日韩欧美在线播放不卡| 欧美交受高潮1| 久久精品综合网| 亚洲欧美日韩国产综合| 日韩视频亚洲视频| 亚洲国产成人久久综合| 久久免费视频一区| 先锋影院在线亚洲| 亚洲精品久久久久久久久久久| 狠狠v欧美v日韩v亚洲ⅴ| 国产精品福利av| 欧美日韩一区二区免费在线观看| 久久久亚洲欧洲日产国码αv| 亚洲欧美日韩天堂一区二区| 亚洲自拍偷拍色片视频| 欧美成人国产| 免费精品视频| 免费成人性网站| 久热re这里精品视频在线6| 欧美诱惑福利视频| 欧美一区二区三区的| 亚洲欧美另类中文字幕| 亚洲欧美韩国| 欧美激情一区二区三区全黄| 亚洲国产欧美在线| 欧美国产精品专区| 欧美大片免费观看在线观看网站推荐| 美女脱光内衣内裤视频久久影院 | 日韩视频一区二区在线观看| 91久久香蕉国产日韩欧美9色| 在线看日韩av| 亚洲国产日日夜夜| 亚洲精品综合久久中文字幕| 亚洲人被黑人高潮完整版| 亚洲三级性片| 亚洲色在线视频| 亚洲欧美日韩一区二区三区在线观看 | 亚洲美女电影在线| 99精品免费网| 午夜精品福利电影| 欧美成人国产| 亚洲国产婷婷香蕉久久久久久99 | 老司机精品视频网站| 久久综合九色综合欧美就去吻| 美女日韩欧美| 91久久极品少妇xxxxⅹ软件| 99视频精品在线| 亚洲欧美日韩高清| 久久男人av资源网站| 久久综合99re88久久爱| 欧美韩国在线| 国产精品美女黄网| 黑人极品videos精品欧美裸| 亚洲欧洲精品一区二区三区 | 欧美国产精品v| 夜夜爽www精品| 欧美在线观看视频一区二区三区 | 中日韩高清电影网| 久久国产欧美日韩精品| 欧美国产日韩免费| 国产麻豆午夜三级精品| 亚洲国产视频a| 亚洲欧美综合v| 蜜桃精品久久久久久久免费影院| 亚洲国产精品v| 午夜国产欧美理论在线播放| 欧美.www| 国色天香一区二区| 亚洲资源av| 欧美激情日韩| 欧美一区国产在线| 欧美理论片在线观看| 国模私拍视频一区| 亚洲一区在线播放| 亚洲成人在线视频网站| 午夜精品福利一区二区三区av | 国产日韩欧美二区| 99成人精品| 你懂的国产精品| 午夜在线a亚洲v天堂网2018| 欧美日韩亚洲在线| 亚洲人人精品| 麻豆亚洲精品| 欧美一区在线看|