2014-04-02 45 views
1

我会以任何语言回答......即使是伪代码......即使只是 一个想法或概念如何做到这一点。 (我用VB.NET工作喽。)将W降低到X和Y之间

我给你3个值:

  • W = 20141231
  • X = 100
  • Y = 200
  • Z = ?

您必须在数学上减少W ...,以便它将落入X和Y(包含)之间的 范围内。如果您在运行代码一遍又一遍。W总是会减少到 相同的值Z.我会打电话给你的结果Z.

如果我给你一个新的价值,明天用W ...它也会被减少,但是对于Z的不同值(对于Z我根据当前日期做了W,只是为了保持简单的东西 ,并且为Z每天生成不同的值)。

没有什么可以随机的。

没有人能够通过查看W. (当然没有窃取代码的副本)来预测Z将会是什么。他们甚至不会猜测Z会发生经常比100-110多190-200。相反,Z将 大致均匀分布在100-200之间。

你会用什么算法?你不能只是降低W至Y.(这将是 预测的。)

你不能只挑喜欢147的随机数(这里没有允许随机数。)

我尝试喜欢的东西反复取W并将它除以2 ...,直到它在X和Y之间。 (但是我得到的180-200的Z值远远超过100-120的值....并非“大致均匀分布” )

没有关于“真随机数”或“伪随机”数字的大讨论。或“均匀分布”或“近似均匀分布”的确切定义 。一个偶然的用户会在1000个Z例子处看到 ,只是觉得它“足够接近”而被认为是“大致均匀分布”。

+0

Z = 150/W –

+0

预计您至少会提供一个答案。这个问题甚至不提供算法,更不用说任何代码。 – RobG

回答

0

这听起来和哈希算法很相似。散列(和伪随机数生成器)背后的原理通常涉及以一个数字的modulus来获得在一个范围内均匀分布的结果。

因此,例如,你可以简单地采取W % 101 + 100获得100和200之间的数字。但是,这将使Z很容易预测,因为W+1将映射到Z+1。为了使映射不太明显,您可以先乘以一个任意因子,例如37。这将给像一个结果:

使用小因子样 37
W = 20141231 
W * 37 = 745225547 
W * 37 % 101 = 77 
W * 37 % 101 + 100 = 177 

一个问题是,W + 1映射到Z + 37。如果有人试图猜测链接将简单地比较一串连续的值W,则该模式可能是显而易见的。所以,那么你可以使用一个混杂的技术可能增加的数字的总和在W(称之为D),然后倍频系数设置为(D + 37)

W = 20141231 
D = 2+0+1+4+1+2+3+1=14 
F = 37 + D = 51 
W * 51 = 1027202781 
W * 51 % 101 + 100 = 157 

你可以创造任何形式的任意逻辑适用于W使其看起来更“随机”,然后应用101的模数得到100-200的范围内的数字。不同的技术将导致更均匀或更少的均匀分布,但您应该能够设计出满足您要求的技术。

相关问题