c 中產生不重複的隨機數

時間 2021-07-01 01:37:35

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生成1 20隨機數不重複,C 如何生成不重複的1 100隨機數。

public void generaterandomnums value rand.next 1,21 if list.contains value foreach int temp in list temp c 如何生成不重複的1 100隨機數。有兩種思路 1 隨機生成一個1 100的數,然後判斷...

在Flash中產生隨機數

random函式在flash裡是非常有用的,可以生成基本的隨機數,建立隨機的移動,以及隨機的顏色和其他更多的作用。在下面這個例子中當你每次按下按鈕就會顯示一個從 100到100的隨機數,這個教程將解釋如何做出這個例子以及如何利用random函式產生其他不同的結果。基本的random函式如下 math...

如何用c 產生隨機數,如何用C 產生隨機數?

在煙幹辰 rand 這個函式就是產生隨機數的,想要一個範圍的隨機數,可以用取餘數的方式 如取0 99之間的數,可以rand 100 需要使用rand 和srand 函式 rand 為隨機數函式,產生 0,int型最大值 之間的整數數 srand seed 為初始化隨機數種子函式 具體例子如下 inc...