C语言---随机数函数

常用c函数

drand48   (产生一个正的浮点型随机数)
erand48   (产生一个正的浮点型随机数)
initstate (建立随机数状态数组)
jrand48   (产生一个长整型数随机数)
lcong48   (设置48位运算的随机数种子)
lrand48   (产生一个正的长整型随机数)
mrand48   (产生一个长整型随机数)
nrand48   (产生一个正的长整型随机数)
rand      (产生随机数)
random    (产生随机数)
seed48    (设置48位运算的随机数种子)
setstate  (建立随机数状态数组)
srand     (设置随机数种子)
srand48   (设置48位运算的随机数种子)
srandom   (设置随机数种子)

MS_RTOS系统中随机数测试代码

#include <ms_rtos.h>
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <math.h>
#include "../libc_tests.h"

/*
 * Global data area
 */
static  int         mix_count = 0;                                      /* 确保所有语句被执行           */

/*
 * test_librand
 */
int test_librand(void)
{
    
    
    int             ran, ran0, ran1, ran2;
    long            rano, rano0, rano1, rano2, ranl, rann;
    unsigned int    ranr;
    unsigned short  p[7] = {
    
    1, 2, 3, 4, 5, 6, 7};
    unsigned short  xseed[3] = {
    
    1, 2, 3};
    double          rand0, rand1, rane;

    /*
     * 每次执行程序rand产生的随机数都一样
     * rand_r是rand的可重入版本,每次执行程序产生的随机数并不一样
     */
    ran = rand();

    VAR_USED(rano2);
    VAR_USED(rann);

    srand(0);
    ran0 = rand();
    if ((ran == ran0) || (ran0 < 0)) {
    
    
        err_count++;
        TS_PRT(fp, __func__, "normall call rand seed == 0");
    }

    srand(1);
    ran1 = rand();
    if ((ran1 != ran) || (ran1 < 0)) {
    
    
        err_count++;
        TS_PRT(fp, __func__, "normall call rand seed == 1");
    }

    srand(2);
    ran2 = rand();
    if ((ran2 == ran) || (ran2 < 0)) {
    
    
        err_count++;
        TS_PRT(fp, __func__, "normall call rand seed == 2");
    }
    mix_count++;

    ran2= rand_r(&ranr);
    if (ran2 < 0) {
    
    
        err_count++;
        TS_PRT(fp, __func__, "normall call rand_r ");
    } else {
    
    
        mix_count++;
    }
    /*
     *  random 返回 long 型随机数
     */
    rano = random();

    srandom(0);
    rano0 = random();
    if ((rano == rano0) || (rano0 < 0)) {
    
    
        err_count++;
        TS_PRT(fp, __func__, "normall call random seed == 0");
    }

    srandom(1);
    rano1 = random();
    if ((rano1 == rano) || (rano1 < 0)) {
    
    
        err_count++;
        TS_PRT(fp, __func__, "normall call random seed == 1");
    }

    srandom(2);
    rano2 = random();
    if ((rano2 == rano0) || (rano2 < 0)) {
    
    
        err_count++;
        TS_PRT(fp, __func__, "normall call random seed == 2");
    }
    mix_count++;

    /*
     * 各函数之间的区别主要体现在 使用的种子(初值)、产生的随机数范围及类型
     */
//    lcong48(NULL);
    lcong48(p);
    mix_count++;

    rand0 = drand48();
    if ((rand0 < 0.0) || (rand0 >= 1.0)) {
    
    
        err_count++;
        TS_PRT(fp, __func__, "normall call drand48");
    }

    lcong48(0);
    rand1 = drand48();
    if ((rand1 < 0.0) || (rand1 >= 1.0)) {
    
    
        err_count++;
        TS_PRT(fp, __func__, "normall call drand48");
    }

    if ((rand0 == rand1)) {
    
    
        err_count++;
        TS_PRT(fp, __func__, "normall call lcong48");
    }

    ranl = lrand48();
    if (ranl < 0) {
    
    
        err_count++;
        TS_PRT(fp, __func__, "normall call lrand48");
    }

    //[-2^31, 2^31),即-2147483648~2147483647
    rano = mrand48();
    if ((rano > 2147483647) || (rano < -2147483648)) {
    
    
        err_count++;
        TS_PRT(fp, __func__, "normall call mrand48");
    }
    ms_printf("mrand num is %ld\n", rano);

//    mrand48();
    mix_count++;

    srand48(0);
    rand0 = drand48();
    if ((rand0 < 0.0) || (rand0 >= 1.0)) {
    
    
        err_count++;
        TS_PRT(fp, __func__, "normall call drand48");
    }

    srand48(3);
    rand1 = drand48();
    if ((rand1 < 0.0) || (rand1 >= 1.0)) {
    
    
        err_count++;
        TS_PRT(fp, __func__, "normall call drand48");
    }

    if ((rand0 == rand1)) {
    
    
        err_count++;
        TS_PRT(fp, __func__, "normall call srand48");
    }

    mix_count++;

//    seed48(NULL);
    seed48(xseed);
    rand0 = drand48();
    if ((rand0 < 0.0) || (rand0 >= 1.0)) {
    
    
        err_count++;
        TS_PRT(fp, __func__, "normall call drand48");
    }

    seed48(0);
    rand1 = drand48();
    if ((rand1 < 0.0) || (rand1 >= 1.0)) {
    
    
        err_count++;
        TS_PRT(fp, __func__, "normall call drand48");
    }

    if ((rand0 == rand1)) {
    
    
        err_count++;
        TS_PRT(fp, __func__, "normall call seed48");
    }

    mix_count++;

//    erand48(NULL);
    rane = erand48(xseed);
    if ((rane < 0.0) || (rane >= 1.0)) {
    
    
        err_count++;
        TS_PRT(fp, __func__, "normall call erand48");
    }

    mix_count++;

//    nrand48(NULL);
    rann = nrand48(xseed);
    if (rann < 0) {
    
    
        err_count++;
        TS_PRT(fp, __func__, "normall call nrand48");
    }

    mix_count++;

//    jrand48(NULL);

    //[-2^31, 2^31),即-2147483648~2147483647
    rano = jrand48(xseed);
    if ((rano > 2147483647) || (rano < -2147483648)) {
    
    
        err_count++;
        TS_PRT(fp, __func__, "normall call jrand48");
    }
    ms_printf("jrand48 num is %ld\n", rano);
    mix_count++;
	return 0;
}

Guess you like

Origin blog.csdn.net/qq_40390825/article/details/115178021