计算随机数的出现次数

时间:2014-06-19 20:01:49

标签: java algorithm hashtable

我想计算一个随机数的出现次数。我将从1到1,000,000,000随机选择1,000,000个数字。

例如:当我输入1000时,它将显示这些1,000,000个数字中1000次发生的次数。

以下是我写的代码,但我不知道为什么它总是输出0。你能帮我解决一下代码吗?

我制作了一个哈希表,并在其中放置链接列表以避免异常,因为1,000,000,000程序内存不足。

public static void main(String[] args) {

    Hashtable<Integer,LinkedList<Integer>> map
            = new Hashtable<Integer,LinkedList<Integer>>();

    int index;
    int b;
    int x;

    for (b=0; b<1000000; b++){
        x = (int) (Math.random()*1000000000)+1;
        index = x % 10000;

        if(map.get(index) == null){
            map.put(index, new LinkedList<Integer>());
            map.get(index).add(x);
        }else{
            map.get(index).add(x);
        }
    }

1 个答案:

答案 0 :(得分:4)

您的代码可能正常运行。这就是原因。

使用您的描述进行统计

  

1,000,000个数字随机从1到1,000,000,000
  发生1000次的次数

在1到1,000,000,000之间选择一个随机数为1,000的特定数字的机会是:

      1
------------- = 0.000 000 001 (very close to zero)
1,000,000,000

如果你做了1,000,000次,那么机会是:

0.000 000 001 * 1,000,000 = 0.001 (still pretty close to zero)

要达到1,您必须再次乘以1,000。

这意味着,根据您的描述编写的程序,您必须运行一千次以确保您能够看到特定的数字1,000出现至少一次

使用您的代码段进行统计

您的实际代码段似乎与您的描述不符。那么让我们分别看一下。

for (b=0; b<1000000; b++){
    x = (int) (Math.random()*1000000000)+1;
    index = x % 10000;

%符号是模数,当数字x完全可被10,000 整除时(注意:不是1,000),它给出0。在将此模数值用作索引之后,您不清楚这个模数值是做什么的,但我只是假设在循环完成后,您将获得index = 0的计数。 / p>

假设是这种情况,那么符合x % 10000 = 0条件的1到1,000,000,000的数字是:

10000, 20000, 30000, .... 999990000, 1000000000

这个数字有10万个。将其中任何一个作为随机数一次的几率为:

   100,000
------------- = 0.0001 (pretty close to zero)
1,000,000,000

由于你重复了1,000,000次,获得x % 10000 = 0的几率是:

0.0001 * 1,000,000 = 100 (very very good!)

这意味着,如果你map.get(0).size(),你应该得到大约100的值。

现实检查

我给了它一个test run on Ideone。事实上,我在几次运行中得到了以下结果。我还插入了map.get(1000)只是为了它。

For map.get(0),    size is 92
For map.get(1000), size is 106

For map.get(0),    size is 113
For map.get(1000), size is 92

For map.get(0),    size is 104
For map.get(1000), size is 86

For map.get(0),    size is 111
For map.get(1000), size is 103