2012-12-21 70 views
1

我有以下方法:爪哇 - 许多调用的Math.random()弄乱环

public LinkedList<Object> init(int counter) { 
    LinkedList<Object> list = new LinkedList<Object>(); 
    double decision, value, key; 
    int max1 = 700; 
    int max2 = 1000; 

    for (int i = 0; i < counter; i++) { 
     decision= Math.random(); 

     if (decision<= 0.2) { 
      key = Math.random() * 1.5; 
      value= Math.random() * max1 ; 
      list.add(new A(value, key)); 
     } else { 
      value= Math.random() * max2 ; 
      list.add(new B(value)); 
     } 
    } 

    return list; 
} 

我得到的问题是这样的:如果我叫使用

init(100); 

这种方法然后检查结果列表的大小,它并不总是100。相反,列表中元素的数量取决于我为max1max2选择的值。例如,如果我选择max2 = 1000000,我最终会列出大约15个元素。我怀疑这与Math.random()的工作方式有关,但不知道它是如何发生的。是关于线程的问题吗?

如果有人想试试这个,这里是班AB模板(其中不玩成这样的工作方式):

public class A { 
    public A(double value, double key) {} 
} 

public class B { 
    public B(double value) {} 
} 
+1

问题不在于线程。就您告诉我们的情况而言,您的程序中只有一个线程正在运行。 – Niklas

+1

你有没有在任何地方看到异常?你有代码调用这个try-catch块吗? –

+0

@Niklas:我怀疑Math.random()可能在后台运行一个线程;我自己并没有创建任何额外的线程。 –

回答

5

我怀疑的Math.random()可能在后台运行线程;我自己并没有创建任何额外的线程。

不,Math.random()不在后台运行任何线程。

事实上,你的功能非常好。我已经对它进行了广泛的测试,并且它完全符合人们的期望。它始终返回counter元素。

因此,我必须得出结论:您的问题存在于其他地方,即在您向我们展示的代码之外。

+0

它确实在我发布的代码之外,谢谢! –