已知可生成0~4的rand5(),实现生成0~6的rand7()

若已知生成0~6的rand7(),求生成0~4的rand5(),则一个方法就是不断生成0~7的数,直到这个数满足0~4就返回。

int rand5(){
    int res;
    do{
        res = rand7();
    }while(res >4);
    return res;
}

现在已知生成0~4的rand5(),求解生成0~6的rand7(),就是想办法利用rand5()去生成0~大于6的数字,可以使用rand5()+rand5()*5,这个式子可以生成0~24的随机数,每个数字的组成只有一种可能,所以是等概率地生成0~24里的每一个数字。

当0~24中大于6的数字可以对7取余得到0~6的数字,但是为了保证出现0~6的数字的每一个概率相同,我们只能在0~20(20=24/7*7-1)中去选择,大于20的数,要被舍弃。

所以实现代码为:

int rand7(){
    int res;
    do{
        res = rand5()+rand5()*5;//生成0~24的随机数
    }while(res>=24/7*7);
    return res%7;
}

参考地址:http://blog.csdn.net/u010025211/article/details/49668017

时间: 2024-10-10 16:26:59

已知可生成0~4的rand5(),实现生成0~6的rand7()的相关文章

已知一个函数rand5()能够生成1-5的随机数,请给出一个函数,该函数能够生成1-7的随机数。

这是朋友去笔试的一道题,有点考智商,当时我还很自信的说 random5+random5/2  不就可以了 他说不行,然后我就在网上搜了一下 有一道类似的题目 题目: 已知一个函数rand7()能够生成1-7的随机数,请给出一个函数,该函数能够生成1-10的随机数. 思路: 假如已知一个函数能够生成1-49的随机数,那么如何以此生成1-10的随机数呢? 解法: 该解法基于一种叫做拒绝采样的方法.主要思想是只要产生一个目标范围内的随机数,则直接返回.如果产生的随机数不在目标范围内,则丢弃该值,重新取

HDU 4371 AliceBob之生成数列直到大于n或者小于等于S(i-2)-思维-(由已知条件推最优步骤)

题意:已知n.d1.d2....dm,Alice先生成一个数S1=0,Bob再生成一个数S2=S1+dk,之后他们生成的数遵循这样的条件:Si=S(i-1)+dk,或者Si=S(i-1)-dk,其中1<=k<=m,S(i-2)<Si<=n.最先写不出一个符合上述条件的数的人输. 分析: 既然想不出什么直接搜索之类的方法,那么一定就是找规律了.这题我们来推一下他的条件得到每个人每一步的最利于自己的做法. 考虑三个数:S(i-2),S(i-1),Si,假设当前步骤是生成Si,那么必须满

两个数组a[N],b[N],其中A[N]的各个元素值已知,现给b[i]赋值,b[i] = a[0]*a[1]*a[2]…*a[N-1]/a[i]

[问题] 1.不用除法运算 两个数组a[N],b[N],其中A[N]的各个元素值已知,现给b[i]赋值,b[i] = a[0]*a[1]*a[2]...*a[N-1]/a[i]: 要求: 1.不准用除法运算 2.除了循环计数值,a[N],b[N]外,不准再用其他任何变量(包括局部变量,全局变量等) 3.满足时间复杂度O(n),空间复杂度O(1). [分析] 提示:题目要求b[i] = a[0]*a[1]*a[2]...*a[N-1]/a[i] ,相当于求:a[0]*a[1]*a[2]*a[3].

【编程题目】n 支队伍比赛,分别编号为 0,1,2。。。。n-1,已知它们之间的实力对比关系,

36.引用自网友:longzuo(运算)谷歌笔试: 19n 支队伍比赛,分别编号为 0,1,2....n-1,已知它们之间的实力对比关系,存储在一个二维数组 w[n][n]中,w[i][j] 的值代表编号为 i,j 的队伍中更强的一支.所以 w[i][j]=i 或者 j,现在给出它们的出场顺序,并存储在数组 order[n]中,比如 order[n] = {4,3,5,8,1......},那么第一轮比赛就是 4 对 3, 5 对 8........胜者晋级,败者淘汰,同一轮淘汰的所有队伍排名不

已知有个rand7()的函数,返回1到7随机自然数,让利用这个rand7()构造rand10() 随机1~10

1.int rand7()    2.{    3.  return rand()%7+1;    4.}    5.  6.int rand10()  7.{  8.    int x=0;  9.    do  10.    {  11.        x=(rand7()-1)*7+rand7();  12.    }  13.    while(x>40);  14.    return x%10+1;  15.} 分析:要保证rand10()在整数1-10的均匀分布,可以构造一个1-1

C# 序列化过程中的已知类型(Known Type)

WCF下的序列化与反序列化解决的是数据在两种状态之间的相互转化:托管类型对象和XML.由于类型定义了对象的数据结构,所以无论对于序列化还是反序列化,都必须事先确定对象的类型.如果被序列化对象或者被反序列化生成的对象包含不可知的类型,序列化或者反序列化将会失败.为了确保DataContractSerializer的正常序列化和反序列化,我们需要将“未知”类型加入DataContractSerializer“已知”类型列表中. 一.未知类型导致序列化失败 .NET的类型可以分为两种:声明类型和真实类

如何过滤出已知当前目录下oldboy中的所有一级目录

第1章 linux启动过程 1.1 linux启动过程(1) 开机自检(BIOS)内存cup是否有问题(硬件检查)(2) MBR引导(3) GRUB菜单(选择不同的内核)(4) 加载内核(kernel)(5) 运行init进程(linux里面的第一个进程,初始化过程)(6) 读取/etc/inittab配置文件(运行级别配置文件)(7) 执行/etc/rc.d/rc.sysinit脚本(系统初始化脚本,设置主机名,设置IP地址)(8) 执行/etc/rc.d/rc脚本(根据系统的云心级别,再开机

COLMAP已知相机内外参数重建稀疏/稠密模型

COLMAP已知相机内外参数重建稀疏/稠密模型 Reconstruct sparse/dense model from known camera poses 参考官方Faq链接:https://colmap.github.io/faq.html#reconstruct-sparse-dense-model-from-known-camera-poses 1. 手动指定相机Pose和注册图像 在目录下手动新建cameras.txt, images.txt, 和 points3D.txt三个文本文件

已知正方形对角线两点求另外两点

正方形,已知 (x0,y0) 和(x2,y2)  可以根据下列关系求(x1,y1),(x3,y3) x1+x3 = x0+x2; x1-x3  =  y2-y0; y1+y3 =  y0+y2; y1-y3 =  x0-x2; node[0].p[1].x = ((node[0].p[0].x+node[0].p[2].x)+(node[0].p[2].y-node[0].p[0].y))/2; node[0].p[1].y = ((node[0].p[0].y+node[0].p[2].y)+