首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

C中如何产生更加合理的随机数

2013-04-02 
C中怎么产生更加合理的随机数C中可以使用rand()和srand(),但是当需要的随机数很小在10的-7方到10的-9时,产

C中怎么产生更加合理的随机数
C中可以使用rand()和srand(),但是当需要的随机数很小在10的-7方到10的-9时,产生的随机数一点都不合理,能有什么方法是随机数更合理吗?

double r = rand()%100 * 10e-9;
[解决办法]

    srand((UINT)time(NULL));

    double f;
    for(int i = 0; i != 500; ++i)
    {
        // 随机产生一个0-1之间的小数
        int n = rand()%1000;  
        if (n == 999)           // 细节处理,否则永远不会随机到1
        {
            f = 1;
        }
        else
            f =  (rand()%1000+1)/(1000.0);        
        f *= 1.5 * 1E-8;        // 结果乘以最大值即可
        cout << f << endl;
    }

[解决办法]
我觉得lz是不是可以举个例子说明一下 rand出来的随机数是怎么不合理的?

如果你要一个精确到小数点后第n位的随机数,那么你可以对小数点后每一位进行随机



如果你要一个的是范围在10的-7方到10的-9之间的随机数,你可以随一个0-100的随机数,然后除以10的-9

如果你说的是浮点数的误差的问题,那这个没有办法,你直接赋值一个浮点数都是有误差的
double a = 1.23f * 1e-10;
我这边显示的是1.2300000190734864e-010


[解决办法]

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
unsigned long ulrand(void) {
    return (
     (((unsigned long)rand()<<24)&0xFF000000ul)
    
[解决办法]
(((unsigned long)rand()<<12)&0x00FFF000ul)
    
[解决办法]
(((unsigned long)rand()    )&0x00000FFFul));
}
int i;
unsigned long ul;
void main() {
    srand(time(NULL));
    for (i=0;i<10;i++) {
        ul=ulrand();
        printf("%010lu 0x%08x\n",ul,ul);
    }
}
//2337588057 0x8b54c359
//1977377429 0x75dc6295
//3607316769 0xd7034921
//0009828482 0x0095f882
//3350859779 0xc7ba1003
//0945794621 0x385fae3d
//3400869024 0xcab524a0
//3097846779 0xb8a563fb
//4287421124 0xff8cdac4
//3934016258 0xea7c5302

[解决办法]
用10进制小数不能精确表示某些三进制小数0.1(3)=0.33333333333……(10)
同理,用二进制小数也不能精确表示某些10进制小数。

热点排行