不用rand如何產生亂數c問題rand預設產生的隨機數範圍

2021-03-07 04:23:07 字數 4546 閱讀 7223

1樓:匿名使用者

亂數是不重複的隨機數嗎?

很多演算法的每乙個計算步驟都是固定的,而在下面我們要討論的概率演算法,允許演算法在執行的過程中隨機選擇下乙個計算步驟。許多情況下,當演算法在執行過程中面臨乙個選擇時,隨機性選擇常比最優選擇省時。因此概率演算法可在很大程度上降低演算法的複雜度。

概率演算法的乙個基本特徵是對所求解問題的同一例項用同一概率演算法求解兩次可能得到完全不同的效果。這兩次求解問題所需的時間甚至所得到的結果可能會有相當大的差別。一般情況下,可將概率演算法大致分為四類:

數值概率演算法,蒙特卡羅(monte carlo)演算法,拉斯維加斯(las vegas)演算法和舍伍德(sherwood)演算法。

數值概率演算法常用於數值問題的求解。這類演算法所得到的往往是近似解。而且近似解的精度隨計算時間的增加不斷提高。

在許多情況下,要計算出問題的精確解是不可能或沒有必要的,因此用數值概率演算法可得到相當滿意的解。

蒙特卡羅演算法用於求問題的準確解。對於許多問題來說,近似解毫無意義。例如,乙個判定問題其解為「是」或「否」,二者必居其一,不存在任何近似解答。

又如,我們要求乙個整數的因子時所給出的解答必須是準確的,乙個整數的近似因子沒有任何意義。用蒙特卡羅演算法能求得問題的乙個解,但這個解未必是正確的。求得正確解的概率依賴於演算法所用的時間。

演算法所用的時間越多,得到正確解的概率就越高。蒙特卡羅演算法的主要缺點就在於此。一般情況下,無法有效判斷得到的解是否肯定正確。

拉斯維加斯演算法不會得到不正確的解,一旦用拉斯維加斯演算法找到乙個解,那麼這個解肯定是正確的。但是有時候用拉斯維加斯演算法可能找不到解。與蒙特卡羅演算法類似。

拉斯維加斯演算法得到正確解的概率隨著它用的計算時間的增加而提高。對於所求解問題的任一例項,用同一拉斯維加斯演算法反覆對該例項求解足夠多次,可使求解失效的概率任意小。

舍伍德演算法總能求得問題的乙個解,且所求得的解總是正確的。當乙個確定性演算法在最壞情況下的計算複雜性與其在平均情況下的計算複雜性有較大差別時,可以在這個確定演算法中引入隨機性將它改造成乙個舍伍德演算法,消除或減少問題的好壞例項間的這種差別。舍伍德演算法精髓不是避免演算法的最壞情況行為,而是設法消除這種最壞行為與特定例項之間的關聯性。

本文簡要的介紹一下數值概率演算法和舍伍德演算法。

首先來談談隨機數。隨機數在概率演算法設計中扮演著十分重要的角色。在現實計算機上無法產生真正的隨機數,因此在概率演算法中使用的隨機數都是一定程度上隨機的,即偽隨機數。

產生隨機數最常用的方法是線性同餘法。由線性同餘法產生的隨機序列a1,a2,...,an滿足

a0=d

an=(ban-1+c)mod m n=1,2.......

其中,b>=0, c>=0, d>=m。d稱為該隨機序列的種子。

下面我們建立乙個隨機數類radomnumber,該類包含乙個由使用者初始化的種子randseed。給定種子之後,既可產生與之相應的隨機數序列。randseed是乙個無符號長整型數,既可由使用者指定也可由系統時間自動產生。

const unsigned long maxshort=65536l;

const unsigned long multiplier=1194211693l;

const unsigned long adder=12345l;

class randomnumber

; randomnumber::randomnumber(unsigned long s)

unsigned short randomnumber::random(unsigned long n)

double randomnumber::frandom(void)

函式random在每次計算時,用線性同余式計算新的種子。它的高16位的隨機性較好,將randseed右移16位得到乙個0-65535之間的隨機整數然後再將此隨機整數對映到0-n-1範圍內。

對於函式frandom,先用random(maxshort)產生乙個0-(maxshort-1之間的整型隨機序列),將每個整型隨機數除以maxshort,就得到[0,1)區間中的隨機實數。

下面來看看數值概率演算法的兩個例子:

1.用隨機投點法計算π

設有一半徑為r的圓及其外切四邊形,如圖所示。向該正方形隨機投擲n個點。設落入圓內的點在正方形上均勻分布,因而所投入點落入圓內的概率為 πr^2/4r^2,所以當n足夠大時,k與n之比就逼近這一概率,即π/4。

由此可得使用隨機投點法計算π值的數值概率演算法。具體實現時,只需要在第一次象限計算即可。

double darts(int n)

return 4*k/double(n);

} 再簡單舉個舍伍德演算法的例子。

我們在分析乙個演算法在平均情況下的計算複雜性時,通常假定演算法的輸入資料服從某一特定的概率分布。例如,在輸入資料是均勻分布時,快速排序演算法所需的平均時間是o(n logn)。但是如果其輸入已經基本上排好序時,所用時間就大大增加了。

此時,可採用舍伍德演算法消除演算法所需計算時間與輸入例項間的這種聯絡。

在這裡,我們用舍伍德型選擇演算法隨機的選擇乙個陣列元素作為劃分標準。這樣既能保證演算法的線性時間平均效能又避免了計算擬中位數的麻煩。非遞迴的舍伍德型演算法可描述如下:

template

type select(type a, int l, int r, int k)

if(j-l+1==k)

return pivot;

a[l]=a[j];

a[j]=pivot;

if(j-l+1

type select(type a, int n, int k)

平時我們一般開始考慮的是乙個有著很好平均效能的選擇演算法,但在最壞情況下對某些例項演算法效率較低。這時候我們用概率演算法,將上述演算法改造成乙個舍伍德型演算法,使得該演算法對任何例項均有效。

不過在有些情況下,所給的確定性演算法無法直接改造成舍伍德型演算法。這時候就可以借助隨機預處理技術,不改變原有的確定性演算法,僅對其輸入進行隨機洗牌,同樣可以得到舍伍德演算法的效果。還是剛才的例子,換一種方法實現:

template

void shuffle(type a, int n) }

2樓:匿名使用者

亂數怎麼搞出來,不用自帶函式~ 我今天被乙個高人問了他是美國碩士,台灣人randseed是乙個無符號長整型數,既可由使用者指定也可由系統時間自動產生。

c++問題 rand() 預設產生的隨機數範圍

3樓:匿名使用者

隨機數bai產生的範圍是:0-0x7fff(也就du是0到32767)

#include

#include

#include

#include

using namespace std;

void main()

{ srand( (unsigned)time( null ) ); //時間參zhi數作為種子

for(int i=0;i<32767;i++){ cout<

時間引數種dao子唯一,版然後取的數目不大於權32767個,基本能夠保證產生的隨機數唯一

4樓:匿名使用者

rand()函式可以用來產生隨機數;

rand()會返回一隨機數值,範圍在0至版rand_max 間。返回0至rand_max之間的權隨機數值,rand_max定義在stdlib.h,(其值至少為32767),運算的結果是乙個不定的數,要看你定義的變數型別,int整形的話就是32767。

在呼叫此函式產生隨機數前,必須先利用srand()設好隨機數種子,如果未設隨機數種子,rand()在呼叫時會自動設隨機數種子為1。一般用for語句來設定種子的個數。

5樓:二十年

0到rand_max,rand_max的值視編譯bai器而定du一般不小於32767,你可以zhi測試dao一下。可以用當前時間做專隨機數的種子保證產生的值不屬同。在程式開始之前呼叫srand((unsigned)time(null));就行了。

rand()是如何確定要產生的隨機數的範圍的?例如:rand()%20;它產生的隨機數的範圍?

6樓:59分粑粑

如果要隨機生成乙個在一定範圍的數,可以在巨集定義中定義乙個random(int number)函式,然後在main()裡面直接呼叫random()函式。

在c語言中,可以使用rand()函式生成隨機數,但這並不是真正意義上的隨機數。 這是乙個偽隨機數,其基於數,可以稱為種子。

作為基準,由遞迴公式計算得出的係數,當這一系列數字很大時,就符合正態公布,等效於生成乙個隨機數。

7樓:匿名使用者

需要考察rand()的返回值範圍,如果是0~rand_max之間,則rand%20產生的是0~19的隨機數

如果rand()返回的是0~1之間的小數,那麼另有演算法。

8樓:匿名使用者

rand()%20 乙個數mod20只能是0-19之間

想產生1-20 可以rand()%20+1

10-20可以 rand()%10+11

9樓:防禦

一般都這麼寫rand()%(y-x+1)+x

10樓:匿名使用者

rand()%n返回的一般都是0-n-1的整數。

如何用rand函式產生隨機數如何用rand函式產生乙個隨機數?

如果需要在數值a b之間隨即產生乙個數,如下操作 單元格中輸入函式 round rand c a 3 函式解釋 在a b區間範圍內隨即產生乙個數,小數點後保留3位!其中的 rand c a 函式解釋 以a為起點,步長為c 在a b中隨即產生乙個數。備註 c 為步長,也就是所取點的範圍長度。在這裡應該...

c產生隨機數的問題

通常隨機數使用都是帶兩個引數的 例 ro.next 1,5 1為下限 包括 5為上限 不包括 結果為產生1 4的隨機數 所以你那個只會是0 public virtual int next int maxvalue 引數maxvalue 要生成的隨機數的上界 隨機數不能取該上界值 maxvalue 必...

C如何輸出很大的數字(不用科學計數法)

可以用long long 變數名 資料 開頭加上 include 然後cout fixed setprecision 0 變數名 在輸出之前,必須裝下吧 當 int64也裝不下的時候就用高精度裝下數字。可以內用陣列,int c n 表示n位長的一容個乙個數,乙個陣列元素放乙個數字,當然壓位更好,即乙...