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

随机数生成器(Random)的误用

阅读更多
很久以前发在公司内网的文章,发出来共享,隐去具体项目、人员的名字。

某日查一个bug,发现类似下面的代码
class Generator
{
...
  private StringBuffer generateRandStr(String strSet,int length)
  {
    StringBuffer sbuf = new StringBuffer() ;
    int charsetSize = strSet.length();
    Random random = new Random();
    for( int i = 0 ; i < length ; i++ )
    {
        //选择一个字符
    int index = random.nextInt( charsetSize ) ;
        char c = strSet.charAt(index);
        sbuf.append( c ) ;
    }
    return sbuf;
  }
...
}

这是一段生成随机字符串的程序,用于生成密码等场合,代码很简单也很清晰,但这里隐藏这一个bug,现象是连续多次调用这个方法产生的结果很多时候是相同的,如果传入的参数一样的话。
原因是什么呢?看到Random,我想到了伪随机数的问题,我们知道计算机算出的随机数通常称之为伪随机数,因为它实际上并不是完全随机的,只要确定了算法和种子,那么产生的随机数是固定的序列,再看一下Random的javadoc就更清楚了:
An instance of this class is used to generate a stream of pseudorandom numbers. The class uses a 48-bit seed, which is modified using a linear congruential formula. (See Donald Knuth, The Art of Computer Programming, Volume 2, Section 3.2.1.)

If two instances of Random are created with the same seed, and the same sequence of method calls is made for each, they will generate and return identical sequences of numbers.

如果连续调用发生在同一毫秒内,就意味着创建的随机数发生器的种子相同,那么结果就是相同的。养成阅读javadoc的习惯可以减少很多出错的机会。

分享到:
评论

相关推荐

    0-100随机数生成器

    总的来说,"0-100随机数生成器"是一个使用JAVA编写的、可以在无JAVA环境的机器上运行的工具,它利用了JAVA的`Random`类或其他随机数生成机制,可能包含用户友好的界面和/或定制的随机数算法。对于那些需要在多种环境...

    随机数生成器源码

    随机数生成器是计算机科学中的一个重要工具,广泛应用于各种领域,如模拟仿真、加密算法、游戏开发、统计分析等。本资源提供了一个随机数生成器的源码以及打包好的软件,用户可以根据自己的需求生成指定区间内的任意...

    随机数生成器

    随机数生成器是一种在计算机程序中广泛使用的工具,它能够按照特定的算法产生一系列不可预测的数字,这些数字在理论上是等概率分布的。在给定的“随机数生成器”主题中,我们可以深入探讨以下几个关键知识点: 1. *...

    sp800_90c_second_draft.pdf 随机数生成器标准 NIST

    NIST SP800-90C是美国国家标准与技术研究院(NIST)发布的关于随机数生成器(Random Number Generators, RNGs)的推荐标准草案。这一草案由Elaine Barker和John Kelsey编写,并发布于2016年4月。它是NIST SP 800-90...

    BAT批处理学习-数值计算-random随机数生成器.zip

    本文将深入探讨“BAT批处理学习-数值计算-random随机数生成器.zip”这个主题,以及如何在批处理脚本中创建随机数生成器。 批处理脚本是基于DOS命令行环境的文本文件,它包含了多个操作系统命令,通过运行这些命令来...

    Linux随机数生成器的原理及缺陷.pdf

    熵值越高,随机数生成器生成的随机数越随机。Linux随机数生成器使用熵池来收集熵值,并通过哈希函数将熵值转换为随机数。 随机数生成器的算法可以分为三部分:熵收集、随机数生成和随机数处理。熵收集部分负责收集...

    用C++写的随机数生成器(含源代码)

    你可以选择不同的随机数引擎,但在这个简单的生成器中,`std::default_random_engine` 已经足够了。 `std::uniform_int_distribution` 是一个整数分布类,它可以生成指定范围内的均匀分布随机数。我们可以通过设定...

    随机数生成器(hex)

    这个生成器生成的随机数可能是以十六进制(hex)或十进制(dec)格式表示的。 随机数生成器的核心在于算法,它可以是伪随机数生成器(PRNG)或真随机数生成器(TRNG)。伪随机数生成器基于确定性的数学算法,虽然...

    随机段小数生成器1_区间随机数生成器_

    在计算机科学中,虽然不能真正做到完全的随机性(因为计算机是基于确定性的),但我们使用伪随机数生成器(Pseudo-Random Number Generator, PRNG)来模拟随机性。这些算法使用一个初始值(称为种子)来产生一系列...

    java随机数生成器

    可以生成制定范围内的随机数。有GUI界面

    随机数生成器-Python编写

    在编程领域,随机数生成器是一种非常重要的工具,特别是在模拟、加密、游戏开发以及数据分析等多个领域。Python作为一门广泛使用的编程语言,内置了强大的随机数模块`random`,使得开发者可以方便地生成各种类型的...

    随机数生成器(源码)

    因此,我们可以编写一个自定义的随机数生成器,利用VB中的`System.Random`类,它可以更灵活地生成指定区间的随机数,包括整数和浮点数。以下是一个简单的示例: ```vb Imports System Public Class CustomRandom ...

    C 代码 实现具有拆分功能的随机数生成器 (RNG), 允许计算多个独立的流.rar

    在本文中,我们将深入探讨如何使用C语言实现一个具有拆分功能的随机数生成器(RNG)。随机数生成器在各种科学计算、模拟、游戏开发以及加密算法中都有着广泛的应用。一个支持拆分功能的RNG允许我们生成多个独立的...

    随机数生成器(包括数字、字母、特殊符号)

    随机数生成器(包括数字、字母、特殊符号)

    Winform-随机数生成器

    总的来说,"Winform-随机数生成器"是一个实用的小工具,它利用C#的`Random`类和Winform的交互能力,实现了对随机数生成的自定义控制,满足了不同用户在不同场景下的需求。无论是测试数据的生成,还是作为其他应用的...

    随机数生成_随机数生成_随机数生成_

    随机数生成器(Random Number Generator, RNG)是实现这一功能的核心工具。常见的RNG类型有线性同余法、Mersenne Twister、ISAAC等。线性同余法是最简单的随机数生成算法,但其周期短,易产生重复序列。Mersenne ...

    随机数产生器random number

    在编程领域,随机数生成器(Random Number Generator,RNG)是至关重要的工具,它被广泛应用于各种场景,如模拟仿真、加密算法、游戏开发、数据分析等。标题中的"random number"指的是这个小程序的主要功能,即生成...

Global site tag (gtag.js) - Google Analytics