利用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()。

一个可行的方法

1
2
3
4
rand 7 ()               得到随机数{ 1 2 3 4 5 6 7 }
rand 7 () -1              得到随机数{ 0 1 2 3 4 5 6 }           -------集合A
(rand 7 () -1 )* 7          得到随机数{ 0 7 14 21 28 35 42 }      -------集合B                       
(rand 7 () -1 )* 7 +rand 7 () 得到随机数{ 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。

 





本文转自jihite博客园博客,原文链接:http://www.cnblogs.com/kaituorensheng/p/3970452.html,如需转载请自行联系原作者


相关文章
|
22天前
|
算法 安全 大数据
【C/C++ 随机函数行为】深入探索C++中的随机数:std::random_device与rand的行为分析(二)
【C/C++ 随机函数行为】深入探索C++中的随机数:std::random_device与rand的行为分析
46 0
|
22天前
|
算法 安全 数据安全/隐私保护
【C/C++ 随机函数行为】深入探索C++中的随机数:std::random_device与rand的行为分析(一)
【C/C++ 随机函数行为】深入探索C++中的随机数:std::random_device与rand的行为分析
44 0
|
4月前
Math.random()随机函数的一些常用封装方法
Math.random()随机函数的一些常用封装方法
|
9月前
|
存储 算法 C语言
你不了解的随机函数rand
你不了解的随机函数rand
79 0
|
12月前
|
存储 C++
【C/C++】如何生成随机数?带你深入了解rand函数
【C/C++】如何生成随机数?带你深入了解rand函数
154 0
LeetCode 470. 用 Rand7() 实现 Rand10()
已有方法 rand7 可生成 1 到 7 范围内的均匀随机整数,试写一个方法 rand10 生成 1 到 10 范围内的均匀随机整数。
57 0
|
编译器 C语言 C++
C++中rand随机数的用法
C++标准函数库提供一随机数生成器rand,返回0-RAND_MAX之间均匀分布的伪随机整数。 RAND_MAX必须至少为32767。rand()函数不接受参数,默认以1为种子(即起始值)。 随机数生成器总是以相同的种子开始,所以形成的伪随机数列也相同,失去了随机意义。(但这样便于程序调试)
Random类和Math.random生成的随机数
Random类和Math.random生成的随机数
142 0
【LeetCode】用 Rand7() 实现 Rand10()
【LeetCode】用 Rand7() 实现 Rand10()
102 0
|
Java
Random rand = new Random(47);的简单解释
Random rand = new Random(47);的简单解释
268 0