Java实验--课上提到的随机数生成原理简单实现(不利用库生成随机数的简单算法)

对于随机数的实验,根据课程上的教程,有如下的公式:

对应的变量参数的说明:

其中对应的Mouduls变量对应的就是公式中a的值,在公式中的含义就是相当于要循环多少个数才重复的一个值。

Multiplier对应的就是公式中m的值,表示的是范围值,例如图上的16807表示的就是取种子返回的随机数的范围为0-16806。

公式中的c表示的是公式每次返回的随机数要增长的一个值,如果是常数的话,每次增长的值将会是一个固定的值,就变成了容易重复的状态,所以,为了不使其是一个重复的状态,我打算在每次取完随机数之后将生成的随机数Xn赋值给c;

Xn表示的随机数函数中取种子的一个步骤,其中第一次取值,其实就是取种子的过程,也就是对X0取值的过程,当取到第一个种子后,此后的随机数一般都不用取种子了。

根据上述的简单分析,那么以下就是实验实现随机数的一个算法,代码如下:

package suijishu;

public class Suijishu {

    private long xn=0;
    private long c=0;
    public int random_num(int a,int b)
    {
        return (int) (random()%(b-a+1)+a);
    }
    public long random()    //生成第n+1个的随机数过程
    {
        int Multiplier=16807;
        long Modulus=((1<<31)-1);
        xn=(Modulus*xn+c)%Multiplier;
        c=xn;
        return xn;
    }
    public void setseed(long seed)    //取种子
    {
        xn=seed;
    }

    //主函数
    public static void main(String[] args) {
        // TODO 自动生成的方法存根
        Suijishu sjs=new Suijishu();
        int num[]=new int[6];    //模拟色子的六个面整型变量
        int account=0;
        sjs.setseed(System.currentTimeMillis());
        for(int i=0;i<6000;i++)    //模拟循环6000次摇色子的过程
        {
            account=sjs.random_num(1,6); //摇色子
            ++num[account-1];    //对应的色子面的变量加一
        }
        for(int j=0;j<6;j++)
        {
            System.out.println((j+1)+":"+num[j]);//看最终色子对应面被咬的次数
        }
    }

}

类中setseed是一个取种子的函数,我在代码中取的种子是系统的当前时间。(距离1970年1月1日的毫秒数),因为时间是一直在变得,因此取时间作为种子是一个不错的选择。

random()是一个取种子之后的返回随机数的函数

random_num(int a,int b)是一个封装的函数,返回a-b之间的随机数的值;

下面是实验的截图:

随机数的分布情况还是挺平均的。

原文地址:https://www.cnblogs.com/halone/p/9785876.html

时间: 2024-11-25 00:55:31

Java实验--课上提到的随机数生成原理简单实现(不利用库生成随机数的简单算法)的相关文章

Java实验课:命令行参数是什么?

命令行参数:在命令行中给定的参数就是命令行参数.(即从输入位置角度理解). 命令行的参数 1. 什么是命令行的参数? 如: java Test1 365 156 "China" (以上Test1必须为主类,否则不能运行) 2.命令行的参数由谁来接收? 一个程序开始于对函数main()的调用.在这样做的时候,有两个参数被送给main(), 其中的一个描述了命令行参数的个数,通常称为argc:另一个是命令行参数的数组,通常称为argv. 命令行参数都是字符串,所以argv的类型是char*

第二次Java实验报告

Java实验报告 班级 计科二班 学号 20188437 姓名 何磊 完成时间 2019/9/12 评分等级 实验二 Java简单类与对象 实验目的 掌握类的定义,熟悉属性.构造函数.方法的作用,掌握用类作为类型声明变量和方法返回值: 理解类和对象的区别,掌握构造函数的使用,熟悉通过对象名引用实例的方法和属性: 理解static修饰付对类.类成员变量及类方法的影响. 实验内容 写一个名为Rectangle的类表示矩形.其属性包括宽width.高height和颜色color,width和heigh

# 20155337 2017-2018 1 课上测试、课下作业、实验

20155337 2017-2018 1 课上测试.课下作业.实验 第一周 学习总结 第二周 课堂实践 第三周 学习总结 第四周 学习总结+myod 第五周 学习总结 课堂实践 第六周 学习总结 实验一 第七周 学习总结 实验二 第八周 加分项目pwd 第九周 学习总结 第十周 实验三 第十一周 学习总结

mapreduce课上实验

今天我们课上做了一个关于数据清洗的实验,具体实验内容如下: 1.数据清洗:按照进行数据清洗,并将清洗后的数据导入hive数据库中: 2.数据处理: ·统计最受欢迎的视频/文章的Top10访问次数 (video/article) ·按照地市统计最受欢迎的Top10课程 (ip) ·按照流量统计最受欢迎的Top10课程 (traffic) 3.数据可视化:将统计结果倒入MySql数据库中,通过图形化展示的方式展现出来. 本次主要是因为自己尚未掌握Hive的操作,之后得以请教本宿舍的大佬将hive 配

Java随机数生成原理

一.在j2se里我们可以使用Math.random()方法来产生一个随机数,这个产生的随机数是0-1之间的一个double,我们可以把他乘以一定的数,比如说乘以100,他就是个100以内的随机,这个在j2me中没有. 二.在java.util这个包里面提供了一个Random的类,我们可以新建一个Random的对象来产生随机数,他可以产生随机整数.随机float.随机double,随机long,这个也是我们在j2me的程序里经常用的一个取随机数的方法. 三.在我们的System类中有一个curre

20165305 苏振龙《Java程序设计》第四周课上测试补做

第一次测试 第二次测试 第三次测试 上传代码 第四次测试 总结 之前我一直在git bash进行程序设计,但是对于我来说操作起来有点困难,所以我改用了虚拟机,之后之前一直困扰我的问题在虚拟机下就没有了,而且一些·不要能进行的操作例如"tree","jdb调试"等都可以顺利进行.在上一周的课上试验中因为在用git bash运行代码时总是出现不识别的地方,并且也一直没有很好的解决,在以后的学习中我会多留意一些,看是否能找到解决方法. 原文地址:https://www.c

java课上测试心得

放暑假之前,建民老师就给我们布置了每一天学习两小时的代码,但是自己的不重视,根本就没有达到这个要求,简单学了一点点基本的东西,然后在开学的第一堂课上,连续三个小时的敲代码,让我意识到了自己的问题,一个系统,很多功能都没有实现,真正的感受到了付出与不付出最后的感觉,所以新学期的开始,自己就一定要有自己的规划 . 第一,   在上半年,就听到过建民老师说过一万小时定律,只有真正做一件事情达到一万个小时才能说自己对着一件事情非常的熟悉,而仔细算一算,自己想要在在即大学毕业之前达到一万个小时的目标,每一

Web上传文件的原理及实现

现在有很多Web程序都有上传功能,实现上传功能的组件或框架也很多,如基于java的Commons FileUpload.还有Struts1.x和Struts2中带的上传文件功能(实际上,Struts2在底层也使用了Commons FileUpload). 虽然现在有很多上传组件可以利用,但是了解Web上传文件的原理,对于处理突然出现的问题会有很大的帮助,下面就来讲一下通过浏览器上传文件的基本原理.在了解了原理之后,就可以非常容易地自制满足自身需要的上传组件了. 众所周知,在客户端代码中需要使用<

JAVA实验五(网络编程)

实     验    报     告 课程:Java程序设计                         班级:1351            姓名:姜文敏      学号:20135112 成绩:             指导教师:娄嘉鹏              实验日期:2015.6.9 实验密级:         预习程度:             实验时间:15:20-18:00 仪器组次:                 必修/选修:                  实验序号: