c 中產生不重複的隨機數

2021-07-01 01:38:05 字數 3031 閱讀 9203

1樓:匿名使用者

【解題思路】

這個題目要解決兩個問題:一是產生隨機數;二是不能重複。

●第一個問題:產生隨機數。在c++中要產生隨機數必須用到兩個函式:

srand()和rand()函式,使用這兩個函式必須包含標頭檔案 。其中rand()是產生一個偽隨機數,比如:int a=rand();函式返回值的取值範圍是int型別的取值範圍,如果要取得某個範圍的隨機數,可以通過取餘來實現,比如需要小於100的隨機數可以這麼寫:

int a=rand()%100;需要100-199之間的隨機數可以這麼寫:int a=100+rand()%100。但在使用這個函式之前,還必須通過srand()函式來指定一個隨機種子,如果沒有指定隨機種子,程式每次執行產生的隨機數系列和順序是相同的。

而且srand()指定了隨機種子之後,可以多次使用rand()函式來產生隨機數,而不必每次使用rand()都指定種子。為了確保程式每次執行時的隨機種子都不一樣,最好的辦法是使用系統時間作為隨機種子,比如:srand((int)time(null));

●第二個問題:不重複。這個問題系統沒有提供現成的函式,只能由程式設計者使用程式來實現。

實現的方法就是把每一個得到的隨機數儲存起來,然後當有新的隨機數產生的時候一個個比較,如果出現重複就重新產生隨機數。

像本題要求隨機輸出1-10十個不同的隨機數,就是既要限定範圍,又要不能重複,程式段如下:

【程式**】

#include //控制檯操作標頭檔案

#include //隨機函式標頭檔案

int main()                            //主函式

//顯示隨機數

printf("\n\n");                      //換行

/*上面**第一次產生10個隨機數,因為沒有設定隨機種子,所以程式每次執行得到的數值都相同*/

srand((int)time(null));              //設定系統時間為隨機種子

printf("第二批十個隨機數(每次執行數值都不同):\n");

for(i=0;i<10;i++)                    //產生並顯示10個隨機數

//顯示隨機數

printf("\n\n");                      //換行

/*上面**第二次產生10個隨機數,因為設定系統時間為隨機種子,所以程式每次執行得到的數值都會不同,隨機種子只需設定一次,下面都不需要再設定*/

printf("第三批十個隨機數(10-29,可能重複):\n");

for(i=0;i<10;i++)                    //產生並顯示10個隨機數

//顯示隨機數

printf("\n\n");                      //換行

/*上面**第三次產生10個隨機數,因為設定了初始值並使用了取餘運算子,可以保證產生的隨機數在指定範圍內,因為沒有是否重複的判斷,多執行幾次,會發現這10個隨機數是可能重複的*/

for(i=0;i<10;i++)                    //產生並顯示10個隨機數

{d[i]=10+rand()%20;                //得到隨機數

for(j=0;j

2樓:匿名使用者

#include

#include

#include

#include

using namespace std;

int main()

;random_shuffle(nums.begin(),nums.end());

copy(nums.begin(),nums.end(),ostream_iterator(cout," "));

cout<

為1/n的概率

3樓:韻城之都的管家

因為windows下rand函式取值只有32767個,你可以試試rand()*rand(),這樣可以生成32767*32767範圍的數!

4樓:匿名使用者

演算法就是,每生成一個數就與原來生成的數比較,如果有相等的就就重新生成一個數,這樣就能保證10個數都不相等了。下面這個程式生成數的範圍是0到100:

#include

#include

#include

#define max 100

using namespace std;

int main()

}if(!ret)

if(i==10)

}while(--i)}

5樓:匿名使用者

rand_max是32767, 於是rand()/rand_max得到是1/32767~32767/32767, 乘上n依然只有32767個數

可以通過(rand() << 16) | rand(), 即高16位和低16位分別產生隨機數的方法得到更大的隨機數

另外先儲存再取是個空間時間都特低效的辦法, 更好的演算法可以自己搜一下"c++產生不重複隨機數"

6樓:匿名使用者

用rand()函式,你先網上看看rand()是怎麼用的,注意它是偽隨機,初始化種子要設好,網上查下資料多想下就知道了。接著是,你要不同的10個數。你可以設個陣列儲存已經產生的數。

比如已經產生了第一個數5,你用rand()生成了又一個5時,比較一下以產生的數發現是5,就跳過,看下一個。總能產生10個不同的隨機數。 缺點是rand()不夠好,而且演算法不夠優化,但是能滿足你的要求,就10個數,不影響效率。

如果你要上萬個不一樣的就要好好優化演算法了。

7樓:匿名使用者

#include

#include

#include

#define max 100

using namespace std;

int main()

}if(!ret)

if(i==10)

}while(--i)

} 不應該用int定義main函式 沒有整形的返回值,並且j沒有初始化

c產生隨機數 不重複,C 產生隨機數 不重複

private const int num 3 數目 private const int maxvalue 5 最大數 private const int minvalue 1 最小數 public int sort int num return num public int getnum int ...

用excel生成1萬個不重複的隨機數

201401 5位數 10.5位數生成 1 99999 隨機數序號 結果 10.66923718 20.666948210 30.276677312 40.35952843 50.486855511 60.34990666 70.77859974 80.02875585 90.88373492 第一...

c怎樣生成隨機數C怎樣生成隨機數

random類預設的無參構造來 函式可自以根據當前系統時鐘為種子,進行一系列演算法得出要求範圍內的偽隨機數。random rd new random rd.next 1,10 生成1 10之間的隨機數,不包括10 guid 類 guid globally unique identifier 全球唯一...