随机数的生成

本文讨论了随机数生成方法的优化,包括使用时间作为种子提高随机性,对比传统算法与Mersenne Twister的性能,并展示了通过线性同余法改进随机数生成的实践案例。
部署运行你感兴趣的模型镜像

函数一:int randvoid);

srandseed)中指定seed开始,返回一个范围介于[seedRAND_MAX0x7fff))的随机整数。默认情况下使用的是srand(1)

函数二:void srandunsigned seed);

参数seedrand()的随机种子,即用来初始化rand()的起始值。

 

for(int i=0;i<10;i++)

cout<<setw(4)<<rand()%10;

每次输出的都是: 1   7   4   0   9   4   8   8   2   4

 

srand(1);

for(int i=0;i<10;i++)

cout<<setw(4)<<rand()%10;

每次输出的都是: 1   7   4   0   9   4   8   8   2   4

 

srand(5);

for(int i=0;i<10;i++)

cout<<setw(4)<<rand()%10;

每次输出的都是:4   3   5   9   0   0   7   9   2    0

 

换为srand((unsigned)time(NULL))后每次运行输出的都不一样。但是time(0)只能精确到秒,同一秒内time(0)返回的结果是一样的。

 

方案1

#include<cstdlib>

#include<ctime>

#include<iostream>

#include<iomanip>

using namespace std;

 

int main(){

    long begin=time(0);

    srand((unsigned)time(NULL));

    int count=0;

    for(int i=0;i<100000000;i++)

if(rand()%100==99)

    count++;

    long elapse=time(0)-begin;

    cout<<count<<endl;

    cout<<"elapsed time:"<<elapse<<endl;

 

    return 0;

}

 

方案2

不使用C++提供的rand(),而使用自己的线性同余法制造随机数。

const long MUL=16807L;             

const long ADD=0;                   

const long MOD=0x7fffffffL;   

//线性同余法产生无符号随机数

inline unsigned myRand(){

 static long seed=(long)time(NULL);

 seed=(seed*MUL+ADD)%MOD;

 return (unsigned)seed>>17;      //linear congruential method16位随机性比较好,我们只用它的高15,返回值在[0,32767]

}

 

方案3

把线性同余法LCG(linear congruential generator) 的ADD参数改为13849

 

采用g++编译器在我的机子上运行10次:

方案

Count平均值

平均运行时间(秒)

1

997918.1

2.4

2

997840.3

1.5

3

997936.9

1.4

看来方案3表现的很不错,关键上时间上很占优势!

现在又有一个新的产生随机数的算法叫作Mersenne twister,据说是目前最好的RNGPythonRuby都采用它作为默认的随机数生成算法。

您可能感兴趣的与本文相关的镜像

Seed-Coder-8B-Base

Seed-Coder-8B-Base

文本生成
Seed-Coder

Seed-Coder是一个功能强大、透明、参数高效的 8B 级开源代码模型系列,包括基础变体、指导变体和推理变体,由字节团队开源

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值