【问题标题】:Random in 2 cycle, do I need to reinitialize?2个周期随机,我需要重新初始化吗?
【发布时间】:2010-05-25 19:51:43
【问题描述】:

我有这个代码:

Random r = new Random();
while (mStack[step].hasNext()) {
int rand = r.nextInt(length);
 for (int i = rand; i < length+rand; i++) {
  //use of i and rand                 
 }
}

所有这些都在一个递归调用中。

这是否会为每个 while 迭代播种一个新的 Random,对于每个递归调用都不同?

或者我必须使用

while (mStack[step].hasNext()) {
 Random r = new Random();
int rand = r.nextInt(length);
 for (int i = rand; i < length+rand; i++) {
  //use of i and rand                 
 }
}

请指教

【问题讨论】:

  • 你检查了 rand 的输出值吗?
  • 为什么要为每次通话随机重新播种?这实际上可以导致更少的随机数 - 任何使用 Random 都需要一个种子,因为它只是告诉它在算法/表/等中从哪里开始。除此之外,这些数字将是伪随机的。

标签: java random


【解决方案1】:

不断重新播种是没有好处的。创建Random 的单个实例,并将其作为参数传递到堆栈中的递归方法。

Java 6 中的无参数 Random 构造函数使用实例计数器和当前 System.nanoTime() 值之和作为种子。当然nextInt()不会重新播种。

【讨论】:

    【解决方案2】:

    您需要使用下面的示例。顶部的示例将在每次调用包含方法时重新初始化。第二个将对堆栈中的每个项目执行此操作,这意味着循环中的每次迭代。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-12
      • 2023-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多