博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
随机数生成问题
阅读量:4971 次
发布时间:2019-06-12

本文共 1041 字,大约阅读时间需要 3 分钟。

给定随机生成整数15的函数,写出能随机生成整数17的函数

方法1

rand5()*5+rand5(),得到[6,30]区间内25个数等概率分布

可以只用6~26之间的21个数,映射到1~77个数

27~30怎么办?抛弃掉

int rand7(){    int i;    while((i=rand5()*5+rand5())>26);    return (i-3)/3;}

这样生成的1~7概率均匀,只是其和不等于1

 

方法2

rand5()生成一个5进制的数

假如有3位,那么每一位生成一个rand5(),这个数就是[0,444]上的均匀分布的整数

不过遗憾7不能整除5的幂次方,这样就无法均分7

不过如果位数足够大,则遗漏的概率就会相当的小

 

类似问题

已知rand1()等概率返回0或者1,试写一个函数等概率返回[a,b]之间的整数

用二进制表示ab

得到a的位数,b的位数,

按位生成二进制数,如果超出了[a,b]范围则重新生成

(对于上一题,如果随机数生成器可以生成偶数范围的话,可以先构造rand1(),之后的问题即为本问题)

 

类似问题

已知rand7(),球rand10()

这可以转成第一个问题:先构造rand7()*7+rand7(),然后过滤,再平分

或者可以把rand7()先转成rand5()rand2(),然后组合

int rand10(){    int t1;    int t2;    do{        t1=rand7();    }while(t1>5);    do{        t2=rand7();    }while(t2>2);    return t1+5*(t2-1);}

 

推广:

已知randk(),求randn()

k进制表示n,先求需要多少位,求解m

k^m-1=nm=int(m)+1int randn(){    while(sum>n)    {        for(i=0;i

 

理解这类题的关键知识:

每一位等概率分布 -> 这个数在整个域上也等概率分布

一个等概率分布[a,b]的子集合(例如[a+1,b-1])同样是等概率分布,只是子集合的概率和不为1,但不影响算法实现

 

refhttp://www.cnblogs.com/youxin/p/3351213.html

转载于:https://www.cnblogs.com/plwang1990/p/4889477.html

你可能感兴趣的文章
delphi xe 怎么生成apk
查看>>
cxGrid 知识点
查看>>
门控时钟-理论分析 ---- 转载
查看>>
Java8 Lambda
查看>>
关于https中的算法
查看>>
周记 2015.05.09
查看>>
java之设计模式
查看>>
Oracle之Group by和Having-----转了
查看>>
未能加载文件或程序集“System.Data.SQLite”或它的某一个依赖项”的解决方法
查看>>
【Codeforces】964A Splits【数学题】
查看>>
Python Leetcode 验证回文字符串
查看>>
hadoop学习笔记贰 --HDFS及YARN的启动
查看>>
vs2017 EFCore 迁移数据库命令
查看>>
python实现接入图灵机器人
查看>>
c++ define的用法(转)
查看>>
SQL Server 按某一字段分组 取 最大 (小)值所在行的数据
查看>>
WPF Preview Excel,
查看>>
S8-codelab02
查看>>
Wowza 4.1开发环境配置(Window)
查看>>
概率期望总结
查看>>