由随机数rand5实现随机数rand7

rand5表示生成随机数1,2,3,4,5

rand7表示生成随机数1,2,3,4,5,6,7

要通过rand5构造rand7现在可能没有什么思路,我们先试着用rand7生成rand5

rand7生成rand5很简单,把6和7排除掉就是rand5了,也就是当随机到大于5的时候,就再随机一次,直到小于等于5

代码写起来很容易


public static int rand5(){
    Random ra =new Random();
    int result = ra.nextInt(7)+1;
    while (result > 5){

        result = ra.nextInt(7)+1;
    }

    return result;

}

这时我们可以用同样的思路,先利用rand5把范围放大,然后再排除掉超出的范围

这里我们用这样的一个公式:newRand = n * (Randn – 1) + Randn,这个公式可以保证新的随机数中每个的概率是相同的(可以自己试试其他构造方式,你会发现有的结果中每个数的概率是不同的)

比如rand5,newRand = 5×(Rand5-1)+ Rand5,那么newRand的范围就是1-25

如果你扩大了一次范围之后还是比目标范围小,那么就再将newRand扩大一下newRand2 = n * (newRand – 1) + Randn

这时rand5以及扩大到rand25了,接下来把范围缩小,如果直接排除的话,要除去8-25,这个范围太大了

所以我们找到比25小的最近的7的倍数21

我们把随机数缩小的1-21后,再除以7取余数+1,这样得到的结果就是1-7了


public static int rand7(){
    int result = 25;
    while (result > 21){

        result = 5*(rand5()-1)+rand5();
    }

    return result%7+1;

}

?

原文地址:https://www.cnblogs.com/sfencs-hcy/p/11279714.html

时间: 2024-08-10 19:47:34

由随机数rand5实现随机数rand7的相关文章

《java入门第一季》之HashSet小案例:获取10个1至20的随机数,要求随机数不能重复

这是基于HashSet集合的唯一性. /* * 编写一个程序,获取10个1至20的随机数,要求随机数不能重复. * * 分析: * A:创建随机数对象 * B:创建一个HashSet集合 * C:判断集合的长度是不是小于10 * 是:就创建一个随机数添加 * 否:不搭理它 * D:遍历HashSet集合 */ 代码写了出来: import java.util.HashSet; import java.util.Random; public class HashSetDemo { public s

【HashSet:获取10个1至20的随机数,要求随机数不能重复】

package com.yjf.esupplier.common.test; import java.util.HashSet; import java.util.Random; /** * @author shusheng * @description 获取10个1至20的随机数,要求随机数不能重复 * @Email [email protected] * @date 2018/12/17 15:33 */ public class HashSetDemo { public static vo

数组应用实例(生成并打印随机数和统计随机数的分布)

一.生成并打印随机数 代码如下: <span style="font-size:18px;">#include <stdio.h> #include <stdlib.h> #define N 20 int a[N]; void gen_random(int upper_bound) //生成随机数在0-upper_bound之间 { int i; for(i = 0;i<N;i++) { a[i] = rand()%upper_bound; }

【随机数】生成随机数模板

写个对拍程序的时候生成随机数的模板留在这儿 #include <cstdio> #include <ctime> #include <cstring> #include <cstdlib> #define Int(x, y) (rand() % (y-x+1) + x) int x; int main() { freopen("debug.in", "w", stdout); srand((int)time(0));

java随机生成6位随机数 5位随机数 4位随机数

随机数,应用会相当广,验证数,订单号,流水号拼接. 下面是java随机数生成语句: 生成6位随机数(不会是5位或者7位,仅只有6位): System.out.println((int)((Math.random()*9+1)*100000)); 同理,生成5位随机数: System.out.println((int)((Math.random()*9+1)*10000)); 同理,生成4位随机数: System.out.println((int)((Math.random()*9+1)*1000

【算法】如何用随机函数rand5来构造随机函数rand7

常规方法 今天公司有一个面试题是这样的:假如有一个函数rand5能等概率生成1 - 5 之间的整数,如何利用rand5来实现rand7?rand7函数的要求是能够等概率生成1 - 7之间的整数.说实话我自己也不是很清楚. 这个问题很经典的.carreercup那本书上有个常见的解法,我记得算法大概是这样的,用PHP写写吧: 01 echo 'rand7 = '.rand7(); 02   03 function rand7() 04 { 05     while (true) 06     {

随机数类 Random

import java.util.Random; /* 随机数类 Random 需求: 编写一个函数随机产生四位的验证码. */ public class Demo5 { public static void main(String[] args) { /* Random random = new Random(); int randomNum = random.nextInt(10)+1; //产生 的 随机数就是0-10之间 System.out.println("随机数:"+ r

C++ 随机数

由随机数分布类.随机数引擎类组成. 现在介绍生成整数与浮点数的随机数. 头文件<random>,使用的随机数引擎类是std::default_random_engine,可通过()调用运算符返回随机数,简单的例子: // main.cpp #include <iostream> #include <random> using std::cout; using std::ends; int main() {     std::default_random_engine e

js获取一组不重复的随机数的方法

一.基本思路: 建立一个数组,每次随机取走一个,放到新的数组中. 二.实现方法 1.方法一: (1)创建一个数组arr,数组元素为所有可能出现元素的集合: (2)通过num=Math.floor(Math.random()*num_total*first_value)方法获取随机数. 随机数的范围为0-arr.length; (3)通过push[num]获取数组该位置的元素: (4)通过arr.splice(num,1)删除该元素: 完整写法为: function roa(ar) { var a