由rand7生成rand10以及随机数生成方法

 舍去法

一次rand7运算只能生成7个整数数,没有办法均匀的映射到10个整数上。但是运行两次rand7可以生成49个数字,如果这49个数字是均匀分布的,舍去多余的9个,剩下的40个正好可以映射到10个整数上。
代码1
int  i;
do
{
    i 
=   7   *  (rand7()  -   1 +  rand7();   //  it is now uniformly random between 1 and 49
while (i  >   40 );       //  it is now uniformly random between 1 and 40
return  i  %   10   +   1 ;   //  result is now uniformly random between 1 and 10

这个算法做到了从40个数字均匀映射到1到10,这个说法有些抽象,进一步形象的来说明,考虑如下的种子矩阵:
int  seed7[ 7 ][ 7 =  {
    {
1  ,  2  ,  3  ,  4  ,  5  ,  6  ,  7 },
    {
8  ,  9  ,  10 1  ,  2  ,  3  ,  4 },
    {
5  ,  6  ,  7  ,  8  ,  9  ,  10 1 },
    {
2  ,  3  ,  4  ,  5  ,  6  ,  7  ,  8 },
    {
9  ,  10 1  ,  2  ,  3  ,  4  ,  5 },
    {
6  ,  7  ,  8  ,  9  ,  10 0  ,  0 },
    {
0  ,  0  ,  0  ,  0  ,  0  ,  0  ,  0 }
};
上面1-10数字一共出现了40次,每个数字出现4次,0出现了9次。我们在这个表里筛选,如果选中了0则重新选一次,如果非0则返回结果。那么,1-10恰好可以得到平均的机会:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值