簡體   English   中英

C ++ rand()奇怪的行為

[英]c++ rand() strange behavior

在C ++中使用rand()時,我看到一個非常奇怪的行為。 這是我的代碼。

#include <iostream>
#include <time.h>
#include <stdlib.h>
#include <limits.h>

#define N 10
int main() {
    srand(time(NULL));

    while(true) {
        int i = N * ((double) rand() / (RAND_MAX));
        //std::cout << i << std::endl;  // If there is any code here, everything goes fine.
        if (i == N) {
            std::cout << "i " << i << " should never happen" << std::endl;
        } else {  
            std::cout << ".";
        }
    }
}

這是輸出:

i 10 should never happen
i 10 should never happen
i 10 should never happen
...

這對我來說真的沒有任何意義,因為我認為我永遠不會10歲。奇怪的是,如果我嘗試以下任何一種方法,它都可以正常工作:

  • 我使用調試器並逐步跟蹤代碼,手表中i的值是隨機的。
  • 如代碼注釋中所示,我添加了sdt:cout之類的代碼。
  • 我使用(RAND_MAX + 1.0)而不是(RA​​ND_MAX)。

我的編譯器是mingw32-g ++。exe(TDM-2 mingw32)4.4.1。

這真的讓我感到困惑,有人可以告訴我發生了什么嗎?

這是可以預期的:

rand()函數返回一個偽隨機整數,范圍為0到RAND_MAX (含)(即數學范圍[0, RAND_MAX ])。

蘭德(3)

因此rand() / RAND_MAX 可以為1,因為范圍是包含在內的。 通常使用RAND_MAX + 1修復。

話雖這么說,還有更好的選擇來生成在一定范圍內會產生均勻分布的隨機數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM