如何创建一个不重复的随机数?

时间:2014-01-19 10:26:02

标签: c++

我有一个变量为1或0的变量,我所知道的只是rand()% 2

问题是当我循环它时,它会变为1或大约4倍然后变为0,或者0变为直6次然后变为1。

我希望它像0一样或两次,然后是1,再是0。这样的事情。 有可能这样做吗?

2 个答案:

答案 0 :(得分:3)

如果你真的想要只运行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的机会有1/8,而16个机会中有1/16的机会。当你认为你不关心运行的确切位置时,这就变得更加可能了。有可能。如果你想要公平,请接受这一点,而不是与之作斗争!

哦,不要忘记srand

答案 1 :(得分:3)

您要么是随机数,要么是可预测的结果。你无法选择随机数量,随机数生成器的整点是生成不可预测的东西。

但你可以做的只是以不同的方式使用随机数。如果您想要,最多,连续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;
}

请参阅codepad示例: http://codepad.org/OKe5Agib