计算随机数出现的次数



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

例如:当我输入1000时,它将显示1000在这1,000,000个数字中出现了多少次。

下面是我写的代码,但我不知道为什么它总是输出0。你能帮我修改代码吗?

我做了一个哈希表,并在其中放入链表,以避免异常,因为有1000,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,000,000个从1到1,000,000,000的随机数字
1000出现了多少次

在1到1000,000,000之间选择一个随机数作为特定数字(如1000)的概率是:

      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,你必须再乘以1000。

这意味着,编写一个程序来匹配你的描述,你必须运行它 1000次,以确保你会看到特定的数字1000出现在至少一次

使用代码片段的统计信息

您的实际代码片段似乎与您的描述不匹配。所以让我们分开来看。

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

%符号是模数,当数x能被10000 (注意:不是1000)完全整除时给出0。在使用它作为索引后,不清楚您对这个模数值做了什么,但我只是假设循环完成后,您将获得index = 0的计数。

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

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

有100,000个这样的数字。得到任意一个随机数一次的概率是:

   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的值。

现实

我在Ideone上进行了测试。事实上,我在几次运行中得到了以下结果。我还插入了map.get(1000)只是为了它的heck。

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

最新更新