Time 直接使用系统时间获取随机数

Time 直接使用系统时间获取随机数,time,random,Time,Random,我必须从数组中返回一个随机元素,所以我想出了这个占位符: return codes[(int) (System.currentTimeMillis() % codes.length - 1)]; 现在我想,我很想在真正的代码中使用它。在大多数语言中,Random()种子程序都使用系统时间作为种子,所以为什么不直接使用该时间呢?作为奖励,我不用担心许多RNG的非随机低位。这家伙回来咬我吗?(如果相关的话,语言是Java。)我能想到的唯一理由是:如果系统时钟总是返回16的倍数(例如,在window

我必须从数组中返回一个随机元素,所以我想出了这个占位符:

return codes[(int) (System.currentTimeMillis() % codes.length - 1)];

现在我想,我很想在真正的代码中使用它。在大多数语言中,
Random()
种子程序都使用系统时间作为种子,所以为什么不直接使用该时间呢?作为奖励,我不用担心许多RNG的非随机低位。这家伙回来咬我吗?(如果相关的话,语言是Java。)

我能想到的唯一理由是:如果系统时钟总是返回16的倍数(例如,在windows XP机器上可能会发生这种情况),而您的数组恰好长度为16?

我能想到的唯一原因是:如果系统时钟总是返回16的倍数(例如,在windows XP机器上可能发生这种情况),而您的数组恰好长度为16?

首先开发标准库类通常有很好的理由

虽然在学术环境中尝试编写自己的代码来解决问题可能很酷,但在商业环境中,最好使用经过验证的库和技术,这些库和技术不太可能在应用程序中产生不必要的行为


如果您开始使用您的技术,我强烈建议您编写完整的测试用例来测试边界条件和大量数据点。这将帮助您在代码投入生产之前调试代码。

首先开发标准库类通常有很好的理由

虽然在学术环境中尝试编写自己的代码来解决问题可能很酷,但在商业环境中,最好使用经过验证的库和技术,这些库和技术不太可能在应用程序中产生不必要的行为


如果您开始使用您的技术,我强烈建议您编写完整的测试用例来测试边界条件和大量数据点。这将帮助您在代码投入生产之前调试代码。

这是一个糟糕的想法!想都别想!对这个自行开发的“伪随机数生成器”的连续调用将具有如此强的相关性,以至于您可能只需要使用一个简单的计数器。(如果你错过了,我不推荐。)


编辑以添加:顺便说一句,正如您编码的那样,您的数组索引偶尔会是-1。这也是一个糟糕的想法。

这是一个糟糕的想法!想都别想!对这个自行开发的“伪随机数生成器”的连续调用将具有如此强的相关性,以至于您可能只需要使用一个简单的计数器。(如果你错过了,我不推荐。)


编辑以添加:顺便说一句,正如您编码的那样,您的数组索引偶尔会是-1。这也是一个糟糕的想法。

使用内置的java.util.Random。《有效Java》(第二版,第215页)第47项将此作为一个示例,说明为什么您更喜欢标准库而不是自己的库。它首先解释了
Math.abs(rnd.nextInt()%n
是一种不好的方法,因为它不会产生真正的随机分布,您应该简单地使用
rnd.nextInt(n)
。它接着说:

编写一个版本的
random
方法来纠正这三个错误 弗莱斯,你得知道一个公平的 关于伪随机数的数量 生成器、数论和二的 补码运算

您不必关心如何
nextInt(int)的细节
能做到这一点。一位具有算法背景的高级工程师花了大量时间设计、实现和测试此方法,然后将其展示给该领域的几位专家,以确保其正确性。然后,该库进行了beta测试,发布,并在十年的大部分时间里被数百万程序员广泛使用。该方法尚未发现任何缺陷,但如果发现缺陷,将在下一个版本中修复。通过使用标准库,您可以利用编写该方法的专家的知识和之前使用该方法的人员的经验

需要注意的是,尽管示例中使用的代码与您建议的代码不完全相同,但对于您的示例来说更为正确。随机整数的剩余部分会扭曲分布,但至少它有一些随机性。仅修改时间是一种更糟糕的方法

你低估了伪随机数生成器的复杂性。你所建议的方法存在的问题是,不仅分布可能远不是随机的,而且它确实是可预测的。现实世界中有黑客利用具有可预测种子的伪随机数生成器的例子在扑克中作弊。构建安全软件(Viega和McGraw,2002)包含了讨论这些问题的完整章节

这是一个很好的例子,说明了如何在实践中打破糟糕的PRNG。1999年,Cigital的软件安全小组在ASF Software,Inc.发布的Texas Hold'em Poker的实现中发现了一个严重的缺陷。该漏洞允许作弊玩家实时计算每只手使用的牌组。这意味着这意味着使用该漏洞的玩家知道每个对手手上的牌以及构成翻牌的牌(下注数轮后正面放在桌上的牌)。骗子可以“知道何时握牌,何时折牌”每一次。恶意攻击者都可以利用该漏洞骗取无辜玩家的实际钱财,而不会被抓获。(第238页)

这里有两个问题讨论了随机性的复杂性:

这是一篇只有几周历史的论文(但是有一个真实的