Loading... ## 说明 rand7():等概率随机生成1~7之间的数 rand10():等概率生成1-10之间的数 ## 例题: <div class="panel panel-default collapse-panel box-shadow-wrap-lg"><div class="panel-heading panel-collapse" data-toggle="collapse" data-target="#collapse-9751e6a831f24c4f3b546d147dbfafc673" aria-expanded="true"><div class="accordion-toggle"><span style="">题目</span> <i class="pull-right fontello icon-fw fontello-angle-right"></i> </div> </div> <div class="panel-body collapse-panel-body"> <div id="collapse-9751e6a831f24c4f3b546d147dbfafc673" class="collapse in collapse-content"><p></p> 已有方法 rand7 可生成 1 到 7 范围内的均匀随机整数,试写一个方法 rand10 生成 1 到 10 范围内的均匀随机整数。 不要使用系统的 Math.random() 方法。 <div class="tip inlineBlock info"> 示例 1: 输入: 1 输出: [7] 示例 2: 输入: 2 输出: [8,4] 示例 3: 输入: 3 输出: [8,1,10] </div> 提示: rand7 已定义。 传入参数: n 表示 rand10 的调用次数。 进阶: rand7()调用次数的 期望值 是多少 ? 你能否尽量少调用 rand7() ? 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/implement-rand10-using-rand7 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 <p></p></div></div></div> ## 大神的解题方法和思路: ### 小随机求大随机: <div class="tip inlineBlock success"> 如果要实现已知小的随机数比如: rand7(), 要求大的随机数rand10(); 我们可以用 `( rand7() -1 ) * 7 + rand7()` 得到范围为:1~49之间的等概率随机数 简而言之相当于公式:`( randN() -1 ) * N + randN() ,范围为 : 1~N*N` </div> ### 大随机求小随机: <div class="tip inlineBlock success"> 如果要实现已知大的随机数比如: rand10(), 要求小的随机数rand7(); 我们可以用` rand10() % 7 + 1` 得到范围为:1~7之间的随机数,并且是等概率的! 简而言之相当于公式:`( randN() -1 ) * n + 1 ,范围为 : 1~n` </div> ### 未优化代码:(太懒了) ```cpp class Solution { public: int rand10() { int n = (rand7() - 1) * 7 + rand7(); //我们首先获得一个1~49之间的随机数 while(n > 10)//假如随机数大于10我们一直循环,直到获得小于10的随机数 { n = (rand7() - 1) * 7 + rand7(); } return n; } }; ``` ## 具体解题来源: https://leetcode-cn.com/problems/implement-rand10-using-rand7/solution/cong-zui-ji-chu-de-jiang-qi-ru-he-zuo-dao-jun-yun-/ https://leetcode-cn.com/problems/implement-rand10-using-rand7/solution/xiang-xi-si-lu-ji-you-hua-si-lu-fen-xi-zhu-xing-ji/ 最后修改:2021 年 09 月 05 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果文章有用,请随意打赏。