簡體   English   中英

如何創建一個不重復的隨機數?

[英]How to create a random number that doesn't repeat?

我有一個將變為1或0的變量,我所知道的只是rand()% 2

問題是,當我循環播放時,它會變成1連續約4倍,然后變為0,或者0連續6倍,然后變為1。

我希望它像0一樣代表一兩次,然后是1,然后再次是0。 這樣的事情。 是否有可能做到這一點?

如果您確實希望只運行1或2,同時又保持一定的隨機性,則可以像這樣跟蹤它;

int nextRandomIshThing( ) {
    static int n1 = 0;
    static int n2 = -1;
    if( n1 != n2 ) {
        n1 = n2;
        // use a high-order bit, which supposedly has better randomness
        // 14 because the standard guarantees that rand() produces at least
        // 15 bits of randomness (not sure why that exactly)
        n2 = (rand( ) >> 14) & 1;
    } else {
        n2 = !n2;
    }
    return n2;
}

http://codepad.org/HTTtPezu

但是請注意,這取決於您的使用方式,這意味着用戶可以“玩”您的系統; “我看過2個1,因此下一個必須是0!”。 真正的隨機源將始終產生長序列。 真正的隨機源有八分之一的機會連續產生4個1或0,而有16分之一的機會有5個。當您認為不在乎運行從何處開始時,這種可能性就更大了。可能。 如果您想公平一點,那就擁抱它而不是與之抗爭吧!

哦,別忘了srand

您需要一個隨機數或可預測的結果。 您不能選擇隨機性的數量,隨機數生成器的全部要點是生成不可預測的東西。

但是您可以做的就是簡單地以不同的方式使用隨機數。 如果最多只需要連續運行4次0或1,則可以使用rand確定連續數字的計數,然后自己生成數字:

int number = 0;
for (int runs = 0; runs < 100; ++runs) {
    int count = rand() % 4;
    for (int i = 0; i < (count ? count : 1); ++i) { // Ensure at least 1 run
        printf("%d", number);
    }
    number = 1 - number;
}

請參閱鍵盤示例: http : //codepad.org/OKe5Agib

暫無
暫無

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

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