给定能随机生成整数1到5的函数,写出能随机生成整数1到7的函数
来源:互联网 发布:怎么注册免费的域名 编辑:程序博客网 时间:2024/05/17 08:02
问题:
给定能随机生成整数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.
- 给定能随机生成整数1到5的函数,写出能随机生成整数1到7的函数
- 给定能随机生成整数1到5的函数,写出能随机生成整数1到7的函数。
- 给定能随机生成整数1到5的函数,写出能随机生成整数1到7的函数
- 给定能随机生成整数1到5的函数,写出能随机生成整数1到7的函数
- 给定能随机生成整数1到5的函数,写出能随机生成整数1到7的函数。
- 给定能随机生成整数1到5的函数,写出能随机生成整数1到7的函数
- 给定能随机生成整数1到5的函数,写出能随机生成整数1到7的函数
- 给定能随机生成整数1到5的函数,写出能随机生成整数1到7的函数
- 给定能随机生成整数1到5的函数,写出能随机生成整数1到7的函数
- 给定能随机生成整数1到5的函数,写出能随机生成整数1到7的函数
- 给定能随机生成整数1到5的函数,写出能随机生成整数1到7的函数
- 给定能随机生成整数1到5的函数,写出能随机生成整数1到7的函数
- 给定能随机生成整数1到5的函数,写出能随机生成整数1到7的函数
- 给定能随机生成整数1到5的函数,写出能随机生成整数1到7的函数。
- 给定能随机生成整数1到5的函数,写出能随机生成整数1到7的函数。
- 给定能随机生成整数 1 到 5 的函数,写出能随机生成整数 1 到 7 的函数。
- 谷歌面试题:给定能随机生成整数1到5的函数,写出能随机生成整数1到7的函数
- 谷歌面试题:给定能随机生成整数1到5的函数,写出能随机生成整数1到7的函数
- select函数(二)
- socket中read、write、send、recv函数的比较
- mangos0.9源码解析学习笔记(三)游戏世界模型初始化
- Linux中tty框架与uart框架之间的调用关系
- JSP入门
- 给定能随机生成整数1到5的函数,写出能随机生成整数1到7的函数
- Cache(高速缓冲器)
- 当ORACLE归档日志满后如何正确删除归档日志
- C++因为应用程序没关闭,不能编译程序
- 成功修复2G金士顿U盘
- Git 中文教程
- java版 动态规划求最长公共子序列
- IGT面试
- MFC 写了一个Hello MFC