例如下面的代码。它有一个随机类。然而,它总是在任何地方产生相同的输出。在这种情况下,哪一项是种子?
来源:link
import java.util.Random;
public class RandomTest {
public static void main(String[] s) {
Random rnd1 = new Random(42);
Random rnd2 = new Random(42);
System.out.println(rnd1.nextInt(100)+" - "+rnd2.nextInt(100));
System.out.println(rnd1.nextInt()+" - "+rnd2.nextInt());
System.out.println(rnd1.nextDouble()+" - "+rnd2.nextDouble());
System.out.println(rnd1.nextLong()+" - "+rnd2.nextLong());
}
}
42是种子,正如同样的Javadoc所说。那么,什么是种子呢?随机数很少是真正随机的--通常是伪随机的。这意味着它是从一个函数生成的,这个函数被称为PRNG(伪随机数生成器)。从一个函数生成,反过来,意味着输出不再是随机的,因为它是可预测的!
然而,取决于你的需求,这种伪随机性可能已经足够了--我说足够是因为生成随机位是昂贵的,而且我说的不是时间或内存,而是钱(参见维基百科上的这个链接)。因此,例如,如果你需要一个随机值来在游戏中放置敌人,一个伪随机数是可以的--但是如果你正在构建与安全相关的软件,你想要使用一个真随机数,或者至少是一个加密安全的PRNG。
如何描述PRNG,比如math.random()
中使用的PRNG?这是一个函数,用种子S初始化,返回一个数组a。注意,对于每个整数S,只定义一个数组a。例如(值不是实际值):
first call second call third call
seed: 14329 .18 .82 .5
seed: 3989 .7 .02 .93
当你将本章节的程序运行了几遍后,你就会发现,我们所得到的随机数值都是一样的。很明显,他们不是所谓的随机出现的。 伪随机数出现的特性之一是如果一连串随机数出现的起始点一样,则这一串数字始终是一样的。随机数出现的起始点称作种子。每次运行C++程序时,它默认将随机数种子保持一致。 当你调试程序时,产生相同的序列对你是非常有用的。当你修改程序时,就可以有一个更好的比对。 如果你想换一组随机数,可以使用sr
我读到种子是用来初始化随机数生成器的。但似乎种子的随机性对于从生成器获得良好的随机性并不重要。所以我想明白什么是种子?为什么这么叫?最后,为什么计算机系统中的时间被用来产生这样的种子?
一个简单的新手问题,奇怪的是我一直没能找到解决方法。
问题内容: 在我的代码中,我在不同的类中使用随机数。如何定义随机种子?我可以为主代码中的所有类定义此种子吗? 问题答案: 您可能需要使用特殊的Random类。它使您可以更好地控制随机数。为此,您首先需要创建一个新的随机对象。 然后通过生成一个新的数字 http://docs.oracle.com/javase/6/docs/api/java/util/Random.html
我不明白java.util.random中的Seed是什么意思?我读过为什么这个代码会打印“Hello World”?问题和我仍然对种子感到困惑。谁能亲切地描述一下我,种子到底是什么意思?多谢了。
问题内容: 这是我的代码,使用种子作为参数来生成随机数: 每次我提供种子并尝试生成100个数字时,它们都是相同的。 我怎样才能解决这个问题? 问题答案: 如果你给相同的种子,那是正常的。这是允许测试的重要功能。 选中此选项可了解伪随机生成和种子: 伪随机数发生器 伪随机数生成器(PRNG),也称为确定性随机位生成器DRBG,是一种用于生成近似于随机数属性的数字序列的算法。该序列不是真正随机的,因为