【问题标题】:rand() doesn't follow Gaussian Distribution & Central Limit Theoremrand() 不遵循高斯分布和中心极限定理
【发布时间】:2014-09-24 03:38:49
【问题描述】:

我创建了一个使用 rand() 在 C 中生成重复数字的程序。

但是重复的数字不跟Central Limit Theorem

谁能解决这个 rand() 错误问题,或者除了使用 rand() C 库来生成更好的随机数之外还有其他方法吗?

这是屏幕截图:

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


#define TOTAL_THROW 10000000

typedef enum _COINTOSS {
    UNDEFINED = 0,
    HEAD = 1,
    TAIL = 2
} COINTOSS;

COINTOSS toss_coin () {
    int x = rand() % 2;
    if (x == 0) return HEAD;
    else if (x == 1) return TAIL;
}

void main () {
    int x, i, j, v1 = 0, v2 = 200, total = 0;
    int head_range[25] = {0};
    int tail_range[25] = {0};
    int no_range = 0;
    int count = 0;
    int repeated = 0;
    COINTOSS previos_toss = UNDEFINED;
    COINTOSS current_toss;

    srand(time(NULL));

    for (i=0; i<TOTAL_THROW; i++) {
        current_toss = toss_coin();             // current toss
        if (previos_toss == current_toss) {
            count++;
        } else {
            if (current_toss == HEAD) head_range[count] += 1;
            else if (current_toss == TAIL) tail_range[count] += 1;


            previos_toss = current_toss;
            count = 0;
        }

    }

    for (i=24; i>=0; i--) {
        printf("+%d = %d\n", i+1, head_range[i]);
    }

    puts("________________\n");

    for (i=0; i<25; i++) {
        printf("-%d = %d\n", i+1, tail_range[i]);
    }

    printf("\nTOTAL_THROW: %d\n", TOTAL_THROW);


    printf("\nPress [ENTER] to exit. . .");
    getchar();
}

【问题讨论】:

    标签: c random


    【解决方案1】:

    您的问题是使用模数将随机数置于所需范围内,该范围使用低位(这是一个经典的陷阱):

    int x = rand() % 2;
    

    rand() (a linear congruential generator (LCG)) 的低位不像高位那样随机。这适用于所有 LCG,无论库或语言如何。

    对于 [0..N) 的范围,您应该执行以下操作(使用高位):

    int r = rand() / ( RAND_MAX / N + 1 );
    

    【讨论】:

      猜你喜欢
      • 2015-05-09
      • 1970-01-01
      • 2011-10-27
      • 1970-01-01
      • 2010-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-11
      相关资源
      最近更新 更多