SecureRandom 随机种子

在生成随机数的时候,随机算法的起源数字称为种子数(seed),在种子数的基础上进行一定的变换,从而产生需要的随机数字。

我们知道,Random类中实现的随机算法是伪随机,也就是有规则的随机。相同种子数的Random对象,相同次数生成的随机数字是完全相同的。也就是说,两个种子数相同的Random对象,生成的随机数字完全相同。

SecureRandom和Random类似,如果种子一样则产生的随机数也一样。因为种子确定,随机数算法也确定,因此输出是确定的。如下代码所示,两个随机数生成器secureRandom1和secureRandom2,竟然生成了相同的随机数序列。

public class Test
{
    public static void main(String[] args)
    {
        SecureRandom secureRandom1 = new SecureRandom("abcd".getBytes());
        SecureRandom secureRandom2 = new SecureRandom("abcd".getBytes());
        for (int i = 0; i < 10; i++)
        {
            System.out.print(secureRandom1.nextInt(100) + ",");
        }
        System.out.println();
        for (int i = 0; i < 10; i++)
        {
            System.out.print(secureRandom2.nextInt(100) + ",");
        }
        System.out.println();
        //    结果为:
        //    34,44,40,30,1,73,49,4,37,56,
        //    34,44,40,30,1,73,49,4,37,56,
    }
}

SecureRandom 实现原理

SecureRandom类收集了一些随机事件,比如鼠标点击,键盘点击等等,SecureRandom 使用这些随机事件作为种子。这意味着,种子是不可预测的,而不像Random默认使用系统当前时间的毫秒数作为种子。如下面代码所示,两个随机数生成器secureRandom1和secureRandom2,生成了不相同的随机数序列。

public class Test
{
    public static void main(String[] args)
    {
        SecureRandom secureRandom1 = new SecureRandom();
        SecureRandom secureRandom2 = new SecureRandom();
        for (int i = 0; i < 10; i++)
        {
            System.out.print(secureRandom1.nextInt(100) + ",");
        }
        System.out.println();
        for (int i = 0; i < 10; i++)
        {
            System.out.print(secureRandom2.nextInt(100) + ",");
        }
        System.out.println();
        //    随机结果为:
        //    74,85,26,72,71,27,84,36,25,41,
        //    67,4,54,35,96,47,49,28,40,85,
    }
}

标签: none

[网站公告]-[2024年兼职介绍]


添加新评论