我会用任何语言回答......甚至伪代码......甚至只是 关于如何做到这一点的想法或概念。 (我自己也在使用VB.NET。)
我会给你3个值:
你必须在数学上减少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的例子中,只是觉得它“足够接近”被认为是“大致均匀分布”。
答案 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范围内的数字。不同的技术会导致更均匀或更均匀的分布,但您应该能够设计出满足您要求的技术。