利用rand7()构造rand10()

题意

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

参考代码

int rand7()
{
    srand((int)time(NULL)); //参考    return rand()%7 + 1;
}
int rand10()
{
    int x;
    do
    {
        x = (rand7()-1) * 7 + rand7();
    }while(x > 40);
    return x % 10 + 1;
}

解析

要保证rand10()均匀生成1~10的随机数,可以构造一个0~10n的随机数区间,这样通过rand10n()%10+1就是所求。

现在目标转移到生成rand10n()。如果不能生成正好rand10n(),可以通过生成rand10n+m()通过舍弃多余的m来获得rand10n()。

现在目标转移到生成rand10n+m()。

一个可行的方法

rand7()               得到随机数{1,2,3,4,5,6,7}
rand7()-1             得到随机数{0,1,2,3,4,5,6}           -------集合A
(rand7()-1)*7         得到随机数{0,7,14,21,28,35,42}      -------集合B
(rand7()-1)*7+rand7() 得到随机数{0,7,14,21,28,35,42}+{1,2,3,4,5,6,7}

由于A和B中元素可以看成是独立事件,根据独立事件的概率公式P(AB)=P(A)P(B),得到每个组合的概率是1/7*1/7=1/49,生成概率集合为1~49。

时间: 2024-10-15 01:09:36

利用rand7()构造rand10()的相关文章

已知有个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

已知rand7() 可以产生1~7的7个数(均匀概率),利用rand7()产生rand10()1~10(均匀概率)

题目:已知rand7() 可以产生1~7的7个数(均匀概率),利用rand7()产生rand10()1~10(均匀概率). 解析:首先利用rand7()产生1-5的5个数,每个数的概率为1/5,然后在这5个数的基础上再以1/2的概率加上5,这样就能以1/10的概率产生每一个数. 答案: int rand10() { int tmp1,tmp2; do { tmp1=rand7(); }while(tmp1>5); do { tmp2=rand7(); }while(tmp2>2); retur

用rand7()构造rand10()

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

浅析 rand7生成rand10 方法 之 思想篇(一)

[问题描写叙述] rand7是一个能生成1-7的随机数.要求利用rand7生成1-10的随机数. [算法思想] 1.组合数学方法 第1次 1 2 3 4 5 6 7 之中用rand7取一个数 第2次从 2 3 4 5 6 7 8 之中取一个数 第3次从 3 4 5 6 7 8 9 之中取一个数 第4次从 4 5 6 7 8 9 10 之中取一个数 第5次从 5 6 7 8 9 10 1 之中取一个数 第6次从 6 7 8 9 10 1 2 之中取一个数 ... 第10次从 10 1 2 3 4

[Swift]LeetCode470. 用 Rand7() 实现 Rand10() | Implement Rand10() Using Rand7()

Given a function rand7 which generates a uniform random integer in the range 1 to 7, write a function rand10 which generates a uniform random integer in the range 1 to 10. Do NOT use system's Math.random(). Example 1: Input: 1 Output: [7] Example 2:

LCTF(利用Soapclient构造session原生类)

题目: <?php highlight_file(__FILE__); $b = 'implode'; call_user_func($_GET['f'], $_POST); session_start(); if (isset($_GET['name'])) { $_SESSION['name'] = $_GET['name']; } var_dump($_SESSION); $a = array(reset($_SESSION), 'welcome_to_the_lctf2018'); ca

利用子集构造法实现NFA到DFA的转换

概述 NFA非有穷自动机,即当前状态识别某个转换条件后到达的后继状态不唯一,这种自动机不便机械实现,而DFA是确定有限状态的自动机,它的状态转换的条件是确定的,且状态数目往往少于NFA,所以DFA能够比较方便的机械实现且识别能力方面也和NFA相当.本次实验采用子集构造法来实现不带空弧的由NFA到DFA的转换. 子集构造法的算法如下: 设NFA为M=(K,Σ,f,S0,Z),则构造相应的DFA  M′=(Q,Σ,f′,I0,F)①取I0=S0:②对于状态集Q中任一尚未标记的状态qi={Si1,Si

[转]Asp.net MVC 利用PartialView 构造自定义菜单

本文转自:http://www.cnblogs.com/huyq2002/archive/2012/01/06/2314838.html 在VS2010中利用Asp.net MVC自带的模板生成的菜单是固定的,没办法更改,下面利用PartialView实现简单的一级菜单. 1) 修改_Layout.cshtml,在<nav>部分改成@{ Html.RenderAction("Menu", "Home");} ? <div class="f

Spring Boot 利用插件构造QueryDSL语句时报错:You need to run build with JDK or have tools.jar on the classpath.If this occur....

You need to run build with JDK or have tools.jar on the classpath.If this occures during eclipse build make sure you run eclipse under JDK as well (com.mysema.maven:apt-maven-plugin:1.1.3:process:default:generate-sources) 1. 仔细的看看自己的电脑的环境变量有没有配置错误,我的