ANSI C / rand()%7第一个值始终为3

时间:2014-06-27 17:57:57

标签: c random modulus srand

所以试图找出C中rand()mod k7有什么特别之处。在另一篇文章中有人说C rand()使用http://en.wikipedia.org/wiki/Linear_congruential_generator但是我不知道是什么造成的(mod k7) K->与ANSI C相关的算法的标量特殊。

所以我有以下代码:

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <unistd.h>

void getRand(int* num1, int* num2, int* num3);


int main(int argc, const char * argv[])
{
    int i = 0;
    for (i = 0; i < 100; i++) {

        srand(time(NULL));
        printf("%d\n", rand() % 7 );

        sleep(1);
    }
    return 0;
}

这总是打印3.但是如果我使用任何n使7不分n,我会得到更好的第一个值序列。仍然显然不是随机但更好的只有3或一些c mod 7 = 3.

我故意用循环中的种子以这种方式制作程序,以表明无论种子如何,第一个值总是返回3。

是的我可以获得Xn n > 0的随机数字,但我希望每个Xo都有X1 % 7 != X1 % 7

1 个答案:

答案 0 :(得分:2)

好的,让我们先看一下不仅仅是几个数据点:

#include <stdio.h>
#include <time.h>
#include <stdlib.h>


int main(int argc, const char * argv[])
{
    size_t counters[7] = {0,0,0,0,0,0,0};
    time_t tt = time(NULL);

    //for (size_t i = 0; i < 7; i++) {
    //  printf("result: %d count: %d\n", i, counters[i]);
    //}

    for (size_t i = 0; i < 1000000; i++) {
        srand(tt + i);
        counters[rand() % 7] ++;
    }

    for (size_t i = 0; i < 7; i++) {
        printf("result: %d count: %d\n", i, counters[i]);
    }
}

有了这个,在Windows 7上,Visual Studio 2013编译为C ++我得到

result: 0 count: 142894
result: 1 count: 142850
result: 2 count: 142848
result: 3 count: 142855
result: 4 count: 142854
result: 5 count: 142845
result: 6 count: 142854

你得到了什么,因为我怀疑你会从更大的数据集中获得更好的结果。