使用模数是否有利于高数字?

时间:2010-02-09 19:21:43

标签: math random modulo

在0-32范围内添加6个随机唯一数字并对结果进行模数有利于高数字吗?

示例:9 +10 +11 +18 +25 +28 +32 = 133%20 = 13

5 个答案:

答案 0 :(得分:6)

作为一个有趣的方面,有一种强大的方法可以使用Generating Functions的概念在计算机上手动或非常快速地(而不是使用暴力)来解决这个问题。

(警告:长篇文章)

您正在0到19范围内工作,但是通过从0-32随机生成数字来实现这一目标。

如果获得数字i的机会是p(i)[注意,p(0)= p(1)= p(2)= ... = p(12)和p(13)= .. = p(19)和p(0)= 2p(13))。

现在我们感兴趣的是通过生成6次随机数并将它们相加来获得特定金额的机会。

这可以通过计算多项式的六次幂

中的系数来建模

P(x)= p(0)+ p(1)* x + p(2)* x ^ 2 + ... + p(r)* x ^ r + ... + p(19) * x ^ 19

因此,我们正在研究(P(x))^ 6的系数。

对于给定的问题,我们可以忽略1/33因子(为了比较哪个和更有可能)并且p(0)= 2,p(1)= 2,...,p(19 )= 1。

因此我们看P(x)= 2(1 + x + x ^ 2 + ... + x ^ 12)+ x ^ 13 + x ^ 14 + .. + x ^ 19.

我们现在只需要计算其六次幂的系数,取模数为20的指数并将它们相加。这里可以使用像FFT这样的快速多项式乘法算法。

事实上,我们可以使用一些具有复数的代数手动完成它和/或证明关于概率分布的陈述。

答案 1 :(得分:2)

答案是:这取决于。以下示例程序将打印各种模数值的平均值。显然,这不是一个数学证明,但它应该让你已经感觉到平均值的表现如何:

using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    static Random rand;

    static void Main(string[] args)
    {
        rand = new Random();

        for (int modulus = 1; modulus < 1000; modulus++)
        {
            calculateAverage(modulus);
        }
    }

    public static void calculateAverage(int modulus)
    {
        List<int> moduloList = new List<int>(100);

        for (int i = 0; i < 100; i++)
        {
            int sum = 0;
            for (int k = 0; k < 6; k++)
            {
                sum += rand.Next(0, 33);
            }
            moduloList.Add(sum % modulus);
        }
        Console.WriteLine("Average for modulus {0}: {1}", modulus, moduloList.Average());
    }
}

生成的输出:

Average for modulus 1: 0
Average for modulus 2: 0,49
Average for modulus 3: 1,03
Average for modulus 4: 1,47
Average for modulus 5: 1,96
Average for modulus 6: 2,55
Average for modulus 7: 3,03
Average for modulus 8: 3,42
Average for modulus 9: 4,15
Average for modulus 10: 5,06
Average for modulus 11: 4,62
Average for modulus 12: 5,9
Average for modulus 13: 5,82
Average for modulus 14: 6,8
Average for modulus 15: 7,28
Average for modulus 16: 7,8
Average for modulus 17: 8,15
Average for modulus 18: 9,34
Average for modulus 19: 9,2
Average for modulus 20: 10,36
Average for modulus 21: 9,74
Average for modulus 22: 9,41
Average for modulus 23: 11,5
Average for modulus 24: 11,51
Average for modulus 25: 11,45
Average for modulus 26: 13,05
Average for modulus 27: 12,59
Average for modulus 28: 14,92
Average for modulus 29: 13,1
Average for modulus 30: 14,1
Average for modulus 31: 15,5
Average for modulus 32: 16,46
Average for modulus 33: 16,54
Average for modulus 34: 16,38
Average for modulus 35: 19,61
Average for modulus 36: 17,26
Average for modulus 37: 15,96
Average for modulus 38: 19,44
Average for modulus 39: 17,07
Average for modulus 40: 17,73

答案 2 :(得分:1)

这是一个用于计算概率分布的小型python程序

# modulus
m = 20
# range of the random numbers 0..n-1
n = 33
# number of random numbers in sum
k = 6

# distribution of one random number
# a[i] is the probability that a random number modulo m is i.
a = [0]*m
for i in range(n): a[i % m]+= 1/n

# convolution
b = a
for i in range(1,k):
    # Here b[t] is the probability that the sum of i random numbers is t.
    # Compute c[t] as the probability that the sum of i+1 random numbers is t.
    c = [0]*m
    for i in range(m):
        for j in range(m):
            c[(i+j)%m] += a[i]*b[j]
    b=c

# print the probability distribution of the result
for i in range(m): print(i, b[i])

# compute average
print("average", sum(i*b[i] for i in range(m)))

这给出了以下结果:

0 0.0500007971936
1 0.0499999764222
2 0.0499991633939
3 0.0499984370886
4 0.0499978679688
5 0.0499975063648
6 0.0499973824748
7 0.0499975063648
8 0.0499978679688
9 0.0499984370886
10 0.0499991633939
11 0.0499999764222
12 0.0500007971936
13 0.0500015451796
14 0.0500021452719
15 0.0500025347512
16 0.0500026702559
17 0.0500025347512
18 0.0500021452719
19 0.0500015451796
average 9.50015120662

即。高数字确实更有可能,但差异非常小。

答案 3 :(得分:0)

反例:

9 +10 +11 +18 +25 +28 +32 = 133 % 2 = 1

9 +10 +11 +18 +25 +28 +32 = 133 % 200 = 133

这或许表明你可以有用地澄清或提高你的问题。

答案 4 :(得分:0)

没有。它的均匀,或者至少是偏差似乎不超过0.05%。

即使可能数字的范围不均匀映射到mod(192%20 = 12),分布范围也远大于mod,因此它可以自行运行。 这是我的1,000,000。

MOD COUNT %
0 50098 5.00980
1 49660 4.96600
2 49832 4.98320
3 50150 5.01500
4 50276 5.02760
5 49864 4.98640
6 50282 5.02820
7 49771 4.97710
8 49886 4.98860
9 49663 4.96630
10 49499 4.94990
11 49964 4.99640
12 50155 5.01550
13 50169 5.01690
14 49829 4.98290
15 50191 5.01910
16 49887 4.98870
17 50334 5.03340
18 50139 5.01390
19 50351 5.03510