将W减少到X和Y之间

时间:2014-04-02 03:08:54

标签: javascript vb.net random pseudocode

我会用任何语言回答......甚至伪代码......甚至只是 关于如何做到这一点的想法或概念。 (我自己也在使用VB.NET。)

我会给你3个值:

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

你必须在数学上减少W ...以便它会落入 X和Y之间的范围(包括)。我会把你的结果称为Z。

如果你一遍又一遍地运行该代码...... W将永远减少到 相同的值Z。

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

没有什么是随机的。

没有人能够通过观察W来预测Z会是什么。 (当然,没有窃取代码的副本。)他们甚至无法做到 猜测Z将比100-110更频繁地发生190-200。相反,Z会 大致均匀地分布在100-200之间。

您会使用什么算法?你不能只把W减少到Y.(那就是 可预测的。)

你不能只选择像147这样的随机数。(这里不允许随机数。)

我尝试过多次取W并将它除以2 ......直到它在X和Y之间。 (但是我得到的Z值远远超过100-200,而不是100-120 ......而不是“近似均匀” 根据需要分发。)

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

1 个答案:

答案 0 :(得分:0)

这听起来类似于哈希算法。哈希(和伪随机数生成器)背后的原理通常涉及获取数字的modulus以获得在范围之间均匀分布的结果。

例如,您可以简单地使用W % 101 + 100来获取100到200之间的数字。但是,这会使Z非常可预测,因为W+1会映射到Z+1 }。为了使映射不那么明显,您可以先乘以一个任意因子,比如说37。这会产生如下结果:

W = 20141231
W * 37 = 745225547
W * 37 % 101 = 77
W * 37 % 101 + 100 = 177

使用像37这样的小因素的一个问题是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范围内的数字。不同的技术会导致更均匀或更均匀的分布,但您应该能够设计出满足您要求的技术。