不用API,Java怎样生成随机数?

好威支有希 发布于 2011/08/09 12:39
阅读 2K+
收藏 3
不能用JDK、第三方框架的API,完全自己写代码,怎样实现生成随机数的功能?

以下是问题补充:

@好威支有希:我说的是不能用Math.random()这种JDK自带的类和方法 (2011/08/09 13:50)
加载中
1
郑雨涵
郑雨涵
取时间做种子
1
CheckStyle
CheckStyle

引用来自“张金富”的答案

参照java.util.Random 类自己再做一个类呗。

不过不管什么随机数生成算法都离不开时间作为参数。

时间做参数的做法,是入门级小学生的习题.

高级些的随机数生成方式,可以用环境噪声来实现(熵池)

CheckStyle
CheckStyle
@Jack.arain : 买随机数生成芯片那是最高级的办法. 稍微高级些的,如我所说,自己实现设备噪声/熵池程序.
Jackarain
Jackarain
@CheckStyle : 产生高质量随机数在一般程序中意义不大, 呵呵, 要用程序产生高质量的随机数, 得用加密或哈唏算法去做, 如果用硬件, 是不是代价太高了点?
CheckStyle
CheckStyle
@Jack.arain : 差不多, 我觉得那些以为时间做种子就能产生高质量随机数的程序员,都不是神马合格的.
Jackarain
Jackarain
@CheckStyle : 时间做参数的做法, 为什么是小学生的做法? 我看到的时间做随机数种子的做法是大多数, 难道都是小学生写的代码?
下一页
1
redraiment
redraiment

没人去实现吗?

package redraiment.utils;

import java.util.Date;
import java.util.Iterator;

public class Random implements Iterator<Long> {
    protected static long limit = 65536;
    protected static long unit = 2053;
    protected static long offset = 13849;
    
    private long seed;
    
    public Random() {
        this(10);
    }
    
    public Random(long seed) {
        this.seed = seed % limit;
    }

    @Override
    public boolean hasNext() {
        return true;
    }

    @Override
    public Long next() {
        return seed = (seed * unit + offset) % limit;
    }

    @Override
    public void remove() {
        next();
    }

    public static void main(String[] args) {
        Random rnd = new Random(new Date().getTime());
        for (int i = 0; i < 10; i++) {
            System.out.println(rnd.next());
        }
    }
}
0
无鸯
无鸯

如果连 Java 自带的方法都不能用,那么还用 Java 干嘛啊?

用 java.util.Random 类

星星爷
星星爷
自己实现Random呗
0
SW_master
SW_master

无聊的人做无聊的事

0
好威支有希
好威支有希
做的出来再说无聊,这其实是一道算法题
0
三逢
三逢
jdk包括了jre,jre包括了jvm,不能用JDK,那就是不能用jvm,自己用javascript或者C++实现吧
0
苦行瓜
苦行瓜

你可以参考一下生成随机数的具体算法。

0
张金富
张金富

参照java.util.Random 类自己再做一个类呗。

不过不管什么随机数生成算法都离不开时间作为参数。

0
freish
freish
无论如何,只要用java实现,都逃脱不了使用java API中类和方法的命运
返回顶部
顶部