`
frank-liu
  • 浏览: 1684195 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java 生成若干位随机数的问题

    博客分类:
  • java
 
阅读更多

    在一次编程的过程中偶然碰到一个小问题,就是需要生成一个4位数的随机数,如果是一个不到4位大的数字,前面可以加0来显示。因为要求最后是一个4位的整数,不带小数点。当时就想到了几个办法:

一、 用Math.random()

当时就这么想到,Math.random()方法不正好可以生成[0, 1)之间的数字么?如果用这个数字乘以10000不就是一个从[0, 1000)之间的数字了么? 于是当时就想到了这么一段代码:

 

for(int i = 0; i < 10; i++)
{
        double number = Math.random();
       System.out.println(number * 10000);
 }

为了看看显示结果的情况,用了一个循环。

结果显示的运行结果如下:

 

372.4564939910557
3645.150576934125
6102.8559042871575
9953.00445315209
2063.1098637100063
6217.048150847877
5069.372886881975
8076.738641253838
1288.394893502075
14.324909511606032

    很明显,在最初的设想中,有几个地方是没有考虑到的。

1. Math.random()生成的随机数不一定只有小数点后4位的。所以后面还是可能有多位,所以显示出来的结果有多个小树点。有人可能会想,如果我再把结果中的小数部分去掉呢?这并没有解决问题,其实也就是第二个问题。

2. 因为生成的数字可能足够小,哪怕乘了10000后还是个2位数字或者3位数字。这样的话,如果要凑成一个整4位的,还需要手工在前面补0.

    那么,如果我们用这种很笨的办法来做的话,该怎么样呢?首先需要乘10000,然后将小数部分去掉,再判断生成的数字,1位的补3个0,2位的补2个0,3位的补1个0.

3. 还有一个问题就是,如果我们要将这个问题扩大到生成n位的随机数时,总不能后面去判断多少位,然后再去补0吧。而且,数字足够大的时候还可能会产生溢出的问题,int不够用了,估计还要用BigInteger。

    看来,这个办法不是很好。实现起来也挺费劲。就为了实现这么点功能,还费这老鼻子劲,不值得。

 

二、逐位生成随机数

这个办法相对来说就会简单一点。我们如果利用生成整数的随机函数,然后一位一位的去生成的话。可能会简单一点。于是我们可以用一个这样的办法:

 

Random rnd = new Random();

public String getRandomNumber(int digCount) {
    StringBuilder sb = new StringBuilder(digCount);
    for(int i=0; i < digCount; i++)
        sb.append((char)('0' + rnd.nextInt(10)));
    return sb.toString();
}

     我们用到了java.util.Random这个类。nextInt(n)这个方法可以返回一个从0到n的随机数。

    通过这个办法,我们可以生成一个若干位的随机数,然后用一个字符串的方式来表示。当数字足够长的时候,也不用担心会溢出。

 

补充:

        前面的生成随机数方法还存在着一个小的缺陷。在随机数生成的方法中,我们需要每次重复调用的时候生成的数字都是不一样的。这样就需要每次随机化的时候提供一个随机化的种子(seed)。比较常用的方式就是采用当前的时间。所以说一个比较完整的利用当前时间作为种子,再将需要随机化的范围指定的步骤才算是一个完整的过程。具体的代码如下:

 

import java.util.Random;
import java.util.Date;

class RandomizeNumber
{
    public static void testDate()
    {
        Date date = new Date();
        long timeMill = date.getTime();
        System.out.println(timeMill);
        Random rand = new Random(timeMill);
        for(int i = 0; i < 20; i++)
        {
            System.out.println(rand.nextInt(50));
        }
    }

    public static void main(String[] args)
    {
        testDate();
    }
}

 如果我们每次运行这段代码,就会发现结果不一样,这样就可以保证足够随机化了。下面是一两次运行的结果:

frank@frank-PC:~/programcode/java$ java RandomizeNumber
1352364043027
42
16
19
24
46
45
32
36
3
44
40
20
40
13
14
40
6
46
20
1
frank@frank-PC:~/programcode/java$ java RandomizeNumber
1352364049226
44
38
16
30
9
14
5
47
41
32
17
47
32
35
10
19
42
26
28
42
 
0
0
分享到:
评论
1 楼 mikelij 2012-11-08  
是啊,Random的随机化有点不够。补充是很必要的。

相关推荐

    java实现随即生成彩票号码

    利用随机数,hashset等实现随即生成若干位不重复的红球或蓝球的程序,供参考用,只是一些想法比较好,不足两位前面补零,hashset生成不重复的数列等

    创建一个存储若干随机整数的文本文件,文件名、整数的个数以及范围均由键盘输入。

    在编程领域,尤其是在Java语言中,创建一个存储若干随机整数的文本文件是常见的任务,这涉及到文件操作、随机数生成以及用户输入等基础知识。在这个课题中,我们主要关注以下几个关键知识点: 1. **文件操作**:在...

    Java数据类型练习.doc

    Java 中可以使用 Random 类来生成随机数,例如: ```java int i = 1 + new Random().nextInt(6); ``` 八、实践练习 本文档提供了多种实践练习题,涵盖了基本类型、变量定义、常量、运算符、控制流、数组、随机数等...

    Java常用词汇(java英语)

    14. **Random Number Generation**(随机数生成):Java的`java.util.Random`类提供了生成随机数的功能。 15. **Factoring and Primality Testing**(因子分解/质数判定):数学问题,Java中可通过各种算法实现,如...

    Java随机抽号实训作业

    在本次的Java实训作业“Java随机抽号实训作业”中,我们将聚焦于Java编程语言中的随机数生成和处理,这是编程领域中一个基础且实用的知识点。Java提供了强大的API来支持随机数的生成,这对于模拟、游戏开发、数据...

    微信红包 JAVA

    Java提供了`java.util.Random`类,用于生成各种类型的随机数。在这个示例中,我们需要生成一个随机数来决定每个红包的金额。 2. **数据结构与算法**:为了确保红包金额的合理分配,可能需要用到队列、栈或链表等...

    java常用数值算法集破解版(能看的电子书)

    Java的`Random`类提供了基本的随机数生成,而Apache Commons Math库则提供了更高级的随机数生成器和分布。 10. **复数运算**:复数在物理、工程等领域中有广泛应用。Java的`Complex`类支持复数的运算和函数。 11. ...

    JAVA上机题目小题库

    在这个问题中,我们可以使用 Random 类生成随机数,然后使用 HashSet 保证随机数不重复。最后,我们可以使用 Scanner 类从键盘输入用户的选择,然后对比随机数和用户选择,最后输出结果。 五、集合笛卡尔乘积 设计...

    JAVA-puzzle-game.zip_JAVA 拼图 作业_java 拼图

    这可能涉及到对数组或集合的操作,以及随机数生成器。 4. 状态检查:当用户尝试重新组合拼图时,需要实时检查当前状态是否正确。这可以通过比较当前布局与原始图像进行,可能需要使用位图操作或自定义的比较算法。 ...

    Java实现明日方舟抽卡计算器

    1. 随机数生成:Java的`java.util.Random`类提供了随机数生成的功能。我们可以设定每个等级干员出现的概率,然后通过生成0-1之间的随机数,与每个等级的概率比较,决定抽到哪个等级的干员。 2. 类与对象:创建一个...

    java简单的记忆游戏

    6. **随机数生成**:在初始化游戏时,需要随机排列卡片的位置,这可能使用了Java的`Random`类来生成随机数。 7. **音频处理**:`audio`目录可能包含了游戏的声音文件,Java的`javax.sound`包提供了播放音频的功能,...

    MyEclipse编写的班级随机数据生成器

    - 使用Java的随机数生成器(如java.util.Random)创建随机序列。 - 应用这些随机数到数据结构中,执行随机抽取或分配。 - 将结果呈现给用户,可能包括在控制台输出或者生成新的报告文件。 在压缩包中,"随机数据...

    面向对象JAVA课程设计

    在概要设计阶段,开发者利用JAVA的util包中的Random类来生成随机数,为游戏的不确定性提供支持。GUI界面则构建于javax.swing包的基础之上,主要使用JFrame类作为窗口容器,并通过实现ActionListener接口的...

    用java写的拼图

    这需要随机数生成器,Java的`java.util.Random`类可以实现这一功能。 3. 数据结构:开发者可能使用数组或列表来存储拼图块的信息,包括它们的位置、旋转状态等。 4. 用户交互:Java的图形用户界面(GUI)组件,如...

    java操作excel代码.pdf

    4. 随机数的生成:通过`java.util.Random`类生成随机数,此处用于生成0-99之间的随机整数填充单元格。 接下来是上述内容的详细解释: Apache POI库允许Java开发者读取、修改和创建Excel文件。Java I/O操作是处理...

    java API.zip

    `java.util`提供了集合框架、日期时间处理、随机数生成等功能;`java.io`则用于输入/输出操作。 2. **类(Class)**:Java API中的类是面向对象编程的核心。例如,`ArrayList`和`HashMap`分别代表动态数组和哈希表...

    api_Javaapi文档_

    `java.util`包提供了各种实用工具类,如集合(Collection)框架、日期时间处理、随机数生成等。`java.io`包则用于处理输入输出操作,包括文件读写、流操作等。此外,`java.net`包用于网络编程,`java.sql`包提供了与...

    JAVA简单拼图

    这可能通过随机交换拼图块的位置来实现,需要运用到随机数生成和数组操作。 3. **移动与旋转**:玩家可以拖动或点击拼图块进行移动,也可以选择旋转。这需要实现事件监听器,对用户的鼠标输入做出响应,并更新拼图块...

    java拼图游戏课程设计

    - **随机化**:利用随机数生成器打乱图片块的顺序。 - **拖放功能**:实现图片块的鼠标事件监听,允许玩家通过拖放操作来移动拼图块。 - **正确位置检测**:检查拼图块是否可以与相邻块交换位置,确保游戏逻辑的...

Global site tag (gtag.js) - Google Analytics