原题
题目
给出一个随机产生1到5的函数,不适用其它随机函数的前提下,设计算法返回随机产生1到7的的数字。
思路
假设原始函数为rand1to5(),它能够随机的产生1,2,3,4,5这5个数字。
那么rand1to5() - 1能够随机产生0,1,2,3,4这5个数字。
那么(rand1to5() - 1) * 5能够随机产生0, 5, 10, 15, 20这5个数字。
那么(rand1to5() - 1) * 5 + rand1to5() - 1能够随机产生0到24之间的所有数字,假设用t来保存这个数值。(注意,因为分别两次使用了rand1to5()这个函数,实际上这两次产生的值是没有关联的)
如果t大于20的话,那么重新计算一次(rand1to5() - 1) * 5 + rand1to5() - 1,一直到t小于等于20,由于大于20的概率是随机的,所以可以认为随机产生了0到20之间的21个数字。
这样t % 7 + 1就可以随机产生1到7之间的数字了。
代码
#include<iostream>
#include<cstdlib>
#include<ctime>
using namespace std;
// 随机产生1到5的数字
int getRand1to5() {
return rand() % 5 + 1;
}
// 利用getRand1to5来随机生成1到7
int Rand1to7() {
int t = (getRand1to5() - 1) * 5 + getRand1to5() - 1;
while