如何从该数字的总和以及范围中的随机样本中恢复数字?

时间:2016-11-12 00:47:22

标签: python math cryptography statistics probability

说我有一些号码n==4。假设我从m范围内以均匀和随机的方式绘制了一些[0, 10]。设p(n+m)定义为from __future__ import division import random myRand = random.SystemRandom() n = 4 p = [] guess = [] guess_sum = 0 for i in range(1024): m = myRand.randint(0, 10) p.append(n + m) guess.append(p[i] - 5) guess_sum += guess[i] 的长(例如,1024个条目)列表:

m

如果猜测者知道绘制guess.append(p[i] - 5) 的范围,那么他们只能减去该范围的平均值,因为平均值是均匀随机分布的中心。在我们的示例中,这对应于以下行:

n

我们可以通过计算guess[]中数字的平均值来验证此方法是否能够对隐藏数print("average of entries in guess[] is: ") print(guess_sum/1024) 产生一个很好的估算值:

3.9365234375, 3.9619140625, 4.177734375, 3.763671875, 4.0439453125

例如,我得到的结果如下:1024。根据预期,随着样本数量增加超过4,我们预计我们的结果范围会在n附近收紧。

我的问题 - 如果猜测者不知道m被绘制的范围,那么猜猜者如何能够恢复隐藏号码m?假设n是从每个实验的相同范围中提取的,loop永远不会改变。

我知道有人必须回答这个问题,但我对如何前进感到非常难过。谢谢!

1 个答案:

答案 0 :(得分:0)

我发布此问题后,我发现了一种方法,但只有在我们提前了解m_minm_max的值时才会生效。对于此解决方案,我们需要m_min = 0.

假设我原始问题中定义的所有变量名称。

guesser只知道列表p中的一串值。当猜测者在列表p中附加更多数字时,他们可以记录两个项目:recorded_minrecorded_max,分别对应于看到的最小数字和看到的最大数字。 / p>

让我们将m绘制范围的端点命名为[m_min, m_max]。回想一下,猜测者希望从列表n中的条目中恢复隐藏号码p的值。

recorded_min〜= n + m_min
recorded_max〜= n + m_max

~=意味着大致相等。

在列表p列表中有足够长的一系列条目后,我们会对recorded_min的值有一定的信心,对recorded_max也是如此。

请注意,recorded_max - recorded_min会为您提供m_max - m_min,其中会显示绘制m的范围的长度。

由于我们知道m是从此范围以均匀随机方式绘制的,因此其中心为center = m_min + (recorded_max - recorded_min)/2,或等效center = m_max - (recorded_max - recorded_min/2)。由于我们需要m_min = 0,因此我们拥有随机分布的中心。

我们现在可以在列表p中取样并从每个样本中减去center,并按照之前的平均值得出n的猜测。

# python 2.7.10

from __future__ import division
import random

myRand = random.SystemRandom()
n = 4
p = []
guess = []
guess_sum = 0
num_experiments = 1024 * 80

m_min = 0
m_max = 0

while (m_max <= m_min):
    m_max = myRand.randint(0, 10)

recorded_min = float('inf')
recorded_max = 0
center = 0

for i in range(num_experiments):
    m = myRand.randint(m_min, m_max)
    p.append(n + m)
    if p[i] < recorded_min:
        recorded_min = p[i]
    if p[i] > recorded_max:
        recorded_max = p[i]

center = (recorded_max - recorded_min)/2

for i in range(num_experiments):
    guess.append(p[i]-center)
    guess_sum += guess[i]

print("average of entries in guess[] is: ")
print(guess_sum/num_experiments)
print("true value of n is: ")
print(n)
print("true m_min, m_max are: ")
print(m_min, m_max)
print("guessed m_min, m_max are: ")
print(recorded_min - guess_sum/num_experiments, recorded_max - guess_sum/num_experiments)
print("true center is: ")
print((m_min + m_max) / 2)
print("guessed center is: ")
print(center)

返回:

average of entries in guess[] is: 
4.00238037109
true value of n is: 
4
true m_min, m_max are: 
(0, 2)
guessed m_min, m_max are: 
(-0.00238037109375, 1.99761962890625)
true center is: 
1.0
guessed center is: 
1.0