C语言中的随机数发生器

来源:互联网 发布:droid4x mac 编辑:程序博客网 时间:2024/06/08 17:19


/** * random number generator * rand(),srand(),time() * summary: * 1. 如果seed确定,那么产生的随机数(或随机数序列)也是确定的;默认seed值为1; * 2. 见① * 3. 产生一定范围内的随机数,见test-05 * 4. 局限:随机数不会超过RAND_MAX * 5. 是否等概率:test-07,code-02 * 6. 易犯的错误:test-06 * * 参考文章: * http://c.chinaitlab.com/basic/841799.html, “伪随机数”的产生原理 * http://baike.baidu.com/view/876758.htm, 不完全正确 * http://www.cplusplus.com/reference/clibrary/cstdlib/rand/, rand() * http://www.cplusplus.com/reference/clibrary/cstdlib/srand/, srand() * http://www.cplusplus.com/reference/clibrary/ctime/time/, time() *  * Platform: Windows * Compiler: gcc(CodeBlocks), VC++ 2008 */// code-01#include <stdio.h>#include <stdlib.h>#include <time.h>int main(void){    // test-01: default seed(the default seed is 1)    printf("%d\n", rand());// 41    printf("%d\n", rand());// 18467    printf("%d\n", rand());// 6334    // ①3次结果不一样;但test-03和test-01一样    printf("--------------------\n");    // test-02: set seed to 2    srand(2);    printf("%d\n", rand());    printf("%d\n", rand());    printf("%d\n", rand());    printf("--------------------\n");    // test-03: set seed to 1    srand(1);    printf("%d\n", rand());// 41    printf("%d\n", rand());// 18476    printf("%d\n", rand());// 6334    printf("--------------------\n");    // test function time()    long long timestamp = time(NULL);// time_t: VC下为__int64(或long long)    printf("The current time: %ld\n", timestamp);    printf("--------------------\n");    // test-04    int i;    for(i = 0; i < 100; i++)    {        srand((unsigned int)timestamp + i);        printf("%d\n", rand());    }// ②结果相当有规律:+3或+4    printf("--------------------\n");    // test-05: A typical way to generate pseudo-random numbers in a determined range    srand((unsigned int)time(NULL));    printf("0-14: %d\n", rand() % 15);// 0-14    srand((unsigned int)time(NULL));    printf("1970-1999: %d\n", rand() % 30 + 1970);// 1970-1999printf("--------------------\n");// test-06: 一个容易犯的错误for(i = 0; i < 100; i++){srand((unsigned int)time(NULL));// noteprintf("%d\n", rand());}// 输出全相同,因为在一个程序中time(NULL)每一次的返回值都相同printf("--------------------\n");// test-07: 貌似“不等概率”srand((unsigned int)time(NULL));for(i = 0; i < 100; i++){printf("%d\n", rand());}// 结果表现得貌似“不等概率”:100个数中5位数占大多数    return 0;}/** * code-02: 等概率检验 * 结果表明概率分布近似相等 */#include <stdlib.h>#include <stdio.h>#include <time.h>#define N (RAND_MAX+1)// RAND_MAX is 32767#define LOOP 10000000int main(){int count[N] = {0};int a;int i;srand((unsigned int)time(NULL));for(i = 0; i < LOOP; i++){a = rand() % N;// 0~RAND_MAXcount[a]++;}for(i = (N - 1); i >= 0; i--){printf("%d的个数:%d\n", i, count[i]);}}




原创粉丝点击