Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么要编写自己的随机数生成器?_Java_C#_C++_Random_Numbers - Fatal编程技术网

Java 为什么要编写自己的随机数生成器?

Java 为什么要编写自己的随机数生成器?,java,c#,c++,random,numbers,Java,C#,C++,Random,Numbers,我已经阅读了很多关于如何编写自己的随机数生成器的指南,因此我对为什么要编写自己的随机数生成器感兴趣,因为大多数语言已经提供了生成随机数的函数: 像C++ srand(time(NULL)); rand(); C# 和爪哇 Random rand = new Random(); rand.nextInt(0, 100); 我主要是寻找使用自己的优势。一个可能的原因就在你的问题中 大多数语言已经提供了函数 它们确实如此,但它们往往是不相容的 我不得不写一次,因为我

我已经阅读了很多关于如何编写自己的随机数生成器的指南,因此我对为什么要编写自己的随机数生成器感兴趣,因为大多数语言已经提供了生成随机数的函数:

像C++

    srand(time(NULL));
    rand();
C#

和爪哇

    Random rand = new Random();
    rand.nextInt(0, 100);

我主要是寻找使用自己的优势。

一个可能的原因就在你的问题中

大多数语言已经提供了函数

它们确实如此,但它们往往是不相容的


我不得不写一次,因为我写的(轻量级)加密使用了与解密(VB)不同的语言(Powerscript),并且它们的随机生成器不兼容。

可能的原因之一就在你的问题中

大多数语言已经提供了函数

它们确实如此,但它们往往是不相容的


我不得不写一次,因为我编写的(轻量级)加密使用的是与解密(VB)不同的语言(Powerscript),并且它们的随机生成器不兼容。

有时,即使您需要一个随机数序列,您也可能需要相同的随机数序列(用于调试或其他目的)

在可移植程序中,设计用于在具有不同库和可能不同随机数生成器的不同系统上运行,实现上述目标可能是不可能的

如果您改为实现自己的,那么您就可以控制它,并且可以使它在多个系统上表现相同,而不是依赖于提供的实现


此外,如注释中所述,提供的实现可能会出现某种错误。

有时,即使您需要一个随机数序列,也可能需要相同的随机数序列(用于调试或其他目的)

在可移植程序中,设计用于在具有不同库和可能不同随机数生成器的不同系统上运行,实现上述目标可能是不可能的

如果您改为实现自己的,那么您就可以控制它,并且可以使它在多个系统上表现相同,而不是依赖于提供的实现


此外,如评论中所述,提供的实现可能会有某种缺陷。

如果您已经做了研究,发现默认生成器非常糟糕(如C或Excel中的情况,或IBM臭名昭著的
randu
),您可能会被激励下载或实现更好的生成器。然而,除非你对概率、统计学和数值方法有非常深刻的理解,否则你在任何情况下都不应该尝试创建自己的方法。就连约翰·冯·诺依曼这样的杰出人物也在这件事上搞砸了


另一个原因可能是为了获得结果的跨平台再现性。

如果您做了研究,发现默认生成器非常糟糕(例如C或Excel,或者IBM臭名昭著的
randu
),您可能会被激励下载或实现更好的生成器。然而,除非你对概率、统计学和数值方法有非常深刻的理解,否则你在任何情况下都不应该尝试创建自己的方法。就连约翰·冯·诺依曼这样的杰出人物也在这件事上搞砸了


另一个原因可能是为了获得结果的跨平台再现性。

在大多数语言中,股票随机数生成器通常是伪随机数生成器

伪随机数生成器从某个状态开始,并使用它生成看似一致的不可预测数字序列

已经研究了许多不同的伪随机数生成器。它们有不同的优点和缺点——有些更随机,有些周期更长,有些加密能力强,难以从以前的样本中提取种子,有些速度快,等等

为给定语言选择的是上述特性的折衷。在某些情况下,挑选的一个将被认为是较差的随机数生成器,但由于遗留原因,它被单独作为“股票”随机数生成器(
rand()
是较差的随机数生成器的一个示例)。如果你需要不同于你指定语言的特性,随机数生成器被认为是重要的,那么编写你自己的(或找到一个)大概是获得它的唯一方法

在某些语言中,随机数生成器(或分布生成器)的指定不足,或可能在语言版本之间发生更改。如果您需要随机数生成器的稳定性(例如,您正在使用它从一个小种子按程序生成一个游戏世界——请参阅经典游戏《星际控制2》),则可能需要自己编写,即使它是系统上标准生成器的克隆

如果您需要随机数生成器在一种语言到另一种语言之间保持稳定,那么每种语言都会做出不同的选择

在C++11中,旧的
rand()
大部分已被弃用,并添加了一个新库,其中包含3个引擎、10个预定义生成器、3个引擎适配器、21个发行版和1个非伪随机数生成器(
random\u device
)。发行版未指定,而生成器未指定:如果需要来自给定种子状态的结果的跨编译器兼容性,则需要编写自己的发行版

即使在C++11中,有着如此尴尬的财富,您想要的确切权衡可能也不可用。所以你必须自己写

请注意,C++11的生成器集主要是在C++11出现之前编写的。写它是因为
rand()
被认为是无用的,人们用自己的随机数生成器编写库。收集并在C++版本中正式化的最佳实践。那么另一个re
    Random rand = new Random();
    rand.nextInt(0, 100);