给定能随机生成整数1到5的函数,写出能随机生成整数1到7的函数

http://hi.baidu.com/nicker2010/item/38be6c4a9b7287a7de2a9f1d


关键:5进制数,7等分。近似概率,因为不会是7的倍数,不能达到严格的1/7。


问题:

给定能随机生成整数1到5的函数,写出能随机生成整数1到7的函数。

解答:

假设我们要等概率生成一个3位的10进制数(000 - 999),我们可以在 随机生成整数0到9的函数 基础上,随机生成3个数字组成三位数就得到了结果。

这里类似,我们首先必须认识到:任何一个数都可以用5进制的数来表示,如12 = 5进制(22) = 2*5 + 2。因此假设我们要随机生成[0,444]范围的数,我们只要随机生成3个5进制的数字组合就可以。

这里的主要问题是:7不是5的幂次方。

但是我们可以将某一个5的幂次方均分成 7 段(分别为0 - 6,等概率的落到每一段),利用5进制随机成一个数,看这个数在哪一个段,就代表我们要生成哪一个数字,这样就保证了等概率的生成0 - 6.

有一个小的问题就是:5的幂次方不能整除7,会遗漏最高的几个数。但是我们这里只要数字足够大,则遗漏的概率相当的小。

 

下面是简单的代码:

const int K = 10;//[0, 5^K - 1]
int Base[K],Rnd[K],Step; //Step表每个区间的长度
int Rand15() //已有的随机生成1 - 5的随机函数
{
    return rand()%5 + 1;
}
void Init()
{
    Base[0] = 1;
    for(int i=1 ;i<K; ++i)
        Base[i] = Base[i-1]*5;
    Step = Base[K-1]*5/7;
    //cout<<"Step = "<<Step<<"\tStep*7 = "<<Step*7<<endl;
    srand(time(0));
}
int Rand17() //我们需要写的随机生成1 - 7的随机函数
{
    int Sum = 0;
    for(int i=0 ;i<K; ++i) //随机生成K个1到5的随机数
    {
        Rnd[i] = Rand15();
        Sum += (Rnd[i]-1)*Base[i];
    }
    return Sum/Step + 1;
}

这里K = 10的时候,保证遗漏了2个数,即落到余数里面的概率是:2/9765625.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值