2016-02-04 62 views
-4

我是C/C++的新手。我試圖讓代碼以一定的概率運行。以某種概率運行代碼

例如,我知道下面的代碼,使其與1/2的概率運行:

if (rand() % 2) { 
    // runs 1/2 the time 
} 

但我不知道,使其運行1/4(25%)的最好方法時間。當我投入:

if (rand() % 4) { 
    // runs 1/4 the time 
} 

它運行了四次以上。我也嘗試過:

if (rand() % 2) { 
    // 1/2 
    if (rand() % 2) { 
     // 1/2 * 1/2 = 1/4 
    } 
} 

哪個有效,但它似乎不是最好的方式。此外,該方法將只適用於1/4,1/8,1/16等。我不知道如何做例如1/6。

+7

你知道模運算符'%'是如何工作的嗎?你知道哪些整數值被評估爲真,哪些爲假? – pfnuesel

+2

它是C還是C++,它們是不一樣的。 –

+1

我的問題與C和C++有什麼不同? –

回答

6

你應該把== 0if聲明。

if (rand() % 4 == 0) { 
    // runs 1/4 the time 
} 

rand()返回一個正整數,它可能非常大。模數運算符%執行除法並給出餘數。例如,如果大數除以4,餘數必須是0,1,2或3.它不能是其他任何數字。通過檢查餘數是否等於0,我們選擇了四種可能情況之一。這意味着25%的概率。

您的原始代碼運行過於頻繁的原因,就是rand() % 4在你的if語句計算一切,除了0爲真。所以如果餘數是1,2或3,則條件運行。換句話說,你的代碼正在運行3/4的時間。

+0

DV不解釋爲什麼**。 – Olaf

+0

我正在編輯過程中解釋原因。不知道你爲什麼會投票拒絕正確的答案。 – harry

+0

1)爲了解決某人使用'@ name'。否則您的評論可能不會被注意到! 2)我遵循網站規則。沒有解釋的答案几乎是無用的,因此「沒有幫助」。這麼多評論。現在編輯:'rand'返回一個'0'(通常不被認爲是「正」,但通常爲中性,同時允許負0)的整數。有一個明確定義的上限,而rand()%4可能不會給出一個均勻的分佈,即使在rand中也是如此。我認爲OP知道模運算符的作用;問題更多的是條件。 – Olaf

0

之前我們使用蘭特(),我們需要設置種子吧。我們可以使用時間戳,例如srand(time(NULL))

rand() % n的結果在0,1,2,...,N-1,所以只挑中他們許多均勻隨機分佈,例如0

所以,如果你想在運行代碼以一定的概率,就像1/6,可以使n = 6,所以:

n = 6; 
if (rand() % n == 0) { 
    // your code 
} 

注意:注意你的n,它不能超過RAND_MAX,這是由你的編譯器定義的大。

+0

'rand'不保證提供良好的分配。但如果沒有正確播種,它會產生相同的序列。 – Olaf

+1

@Olaf:我同意,rand()只是一個僞隨機積分發生器,取決於種子輸入。但從某種意義上來說,它仍然可以應用於一些不精確或不安全的算法。如果我們想要一個完全隨機的序列,這是另一個大問題。 –

+0

從這個問題來看,OP似乎關注的是不確定性 - 目前還不清楚到什麼程度。無論如何,只要f(!)除數是一個整數除數「RAND_MAX + 1」,假設一個可接受的'rand'實現,模運算符將生成一個可接受的分佈。對於大多數實現來說,這對兩個冪來說是正確的。但這也不能保證。 – Olaf

-2

我認爲這裏的每個人在思考這個問題的錯誤的方式,還有一個更簡單(但有點更詳細)得到一個簡單的概率像這樣的方式,而這種方式介紹自己更好一點。現在

srand(time(NULL)) 

int number; 

number = rand() % 2 +1; 

if (number == 1) 
{ 
    //Do something 
} 

if (number == 2) 
{ 
    //Do something 
} 

,如果你像我一樣,你會發現,現有的RNG不是隨機的不夠,我們可以在什麼我喜歡稱之爲的「貧民窟高斯RNG」的方法釘,這將迫使計算機產生大量涌現,但從來沒有使用它們,除非它們是等於1或2。

srand(time(NULL)) 

string sky = "blue"; //string for while loop 
int number; 
int hold; // hold the initial result of the RNG 

while(sky == "blue") //if the sky is blue, keep looping 
{ 

    hold = rand() % 10000 +1; 

    number = hold/7; //divide hold by 7, store in number 

    if (number == 1) 
    { 
      //Do something 
      break; //if the result of the division above is exactly 
       //1, break the loop 
    } 

    if (number == 2) 
    { 
      //Do something 
      break; //if the result of the division above is exactly 
       //2, break the loop 
    } 
} 

它可能看起來很奇怪,但它確實工作在股票RNG的增加「隨機性」。

+1

爲什麼'%10000'?爲什麼恆定的'+ 1'?爲什麼用7除?這些東西都不會使它變得更「隨意」,它可能與分配相關,而不是它的幫助。不要這樣做。 – GManNickG

+0

1.使程序不會嘗試除以零。 2.在程序搜索數字1和2之前,這只是增加了隨機性,但是現在它必須搜索數字7和14,它們相距較遠並且具有較低的被「繪製」的概率在相似的時間。 3.不,它不與分配擰緊,自己嘗試。 – user3109891

+0

因此,我剛剛以這種方式執行了3次100000之間的1到2之間的數字,將所有數字之和除以100000,分別得到1.45,1.50,1.47。我真的不知道你在說什麼來搞亂髮行版。 – user3109891