0

根据我的一位老师的说法,为了做到这一点,你制作了两个带有数字的数组,拥有几个小数。一个正阵列和一个负阵列。

数组 1 [0] = 例如 1.5739

数组 2 [0] = 例如 -5.31729

然后你找到当前时间

201305220957 或 2013 年 5 月 22 日上午 9:57

并使用这个等式:

(201305211647*1.5739)--5.31729

- 然后你使用绝对值并四舍五入到小数点后 1.0 位,你就有了你的号码

在大多数生成器中,值是否取决于时间?

4

3 回答 3

7

前面的底线 - 生成随机数真的很难做到正确,并且严重烧毁了一些非常聪明的人(John Von Neumann就是其中之一)。普通人不应该尝试创建自己的 RNG 算法。它需要数论、概率和统计以及数值计算方面的专业知识。除非您在所有三个领域都符合资格,否则最好使用由符合资格的人开发的算法。如果您想知道如何正确操作,您可以在http://en.wikipedia.org/wiki/Random_number_generationhttp://en.wikipedia.org/wiki/Pseudorandom_number_generator找到很多好的信息。

坦率地说,你的老师对这个话题一无所知。

于 2013-05-22T21:43:10.227 回答
0

如果您需要为加密或统计目的生成随机数 - 您需要得到一个经过充分研究的生成器。我喜欢的一个是 Mersenne Twister,它具有非常好的统计特性,运行速度快且易于编码。

如果您只需要一个合理的随机生成器 - 例如让游戏中的事物看起来是随机的 - 您可以使用经典的“线性全等生成器”,它编写起来很简单,并且会产生看起来很随机的输出。(对于重型计算不安全)。

LCG发生器:

int seed = 0x333; // chose any number.

int random() { seed = ( seed * 69069 ) + 1;  return seed; }

您可以使用几个号码来代替 69069。但不要选择您自己的号码。如果您不喜欢 69069,请从此处选择一个。

http://en.wikipedia.org/wiki/Linear_congruential_generator

于 2013-05-22T22:53:04.583 回答
-1

维基百科有很多很棒的页面专门用于随机数生成 (RNG)。一页专门列出了历史上使用的各种类型的随机数生成器。最早和最弱的方法之一被称为中方方法 - 易于在编程中实现并适用于许多低级任务。一些计算机在电路中内置了一个线性反馈移位寄存器 (LFSR),用于生成随机数,但它不是很先进。更现代的生成器之一(不是最现代的),被认为是加密安全的(在不可预测的意义上),被称为 Mersenne Twister。

正确地说,这些是伪随机数生成器 (PRNG),因为它们不是真正随机的。它们不是真正随机的,因为计算机是确定性机器(状态机);没有预先确定的算法可以编程为从已知的先前状态生成真正的随机数。

也就是说,真随机数发生器 (TRNG) 硬件电路(通常是模拟的)的发明确实存在,并且以不同的方式接近。从检查温度和压力等环境条件,到更细微且更受原子/量子条件影响的现象,例如具有反馈的稳态电路处于何种状态。大多数现代个人计算机不使用它,如果它们使用,可能只用它来查找 PRNG 的种子值。然后,您还拥有通过 Internet 连接进行检查的 RNG 程序,以在线查找随机数服务器,其中大多数使用 TRNG。您甚至可以依赖已记录在案的真实世界现象中的查找表;查找表是非常古老的学校。

伪随机数生成器仅具有随机性的外观,即它们遵循特定的分布,并且从先前的值预测未来值的能力并不容易。有一组顽固的测试,其唯一目的是测试随机数生成器的质量。但总的来说,PRNG 是一种产生整数序列的算法。理想情况下,我们正在寻找一种算法,该算法可以从序列中的先前项中产生适当地不可预测(这是最难的部分)的数字序列,同时还遵循特定的分布(通常是均匀的),这意味着a中的每个值范围以相等的比例产生。

一般来说,将一个分布转换为另一个分布是一项微不足道的任务,无论它是 TRNG 还是 PRNG。均匀离散整数分布(这是 PRNG 生成的)可以使用各种保持均匀性的缩放技术轻松扩展或压缩以跨越任意整数区间,或者通过随机选择一个大整数并对其进行缩放来转换为均匀浮点分布下降到一个浮动等。

使用各种方法,例如逆变换采样、拒绝采样或分布上的简单代数关系,可以轻松地将均匀浮点数转换为任何其他非均匀分布,例如正态分布、卡方分布、指数分布等(例如,卡方只是独立正态分布的平方和)。此外,可以使用应用于统一浮点数的简单数学函数适当地近似某些分布。

归根结底,该主题中大多数研究的最难部分和核心在于生成那些均匀分布的整数,它们构成了所有其他分布的基础。

例如,使用时钟时间来获取初始种子值并没有根本性的错误。但是,我倾向于使用以微秒表示的时间的低三位或四位有效数字,以用于适当的不可预测的事情。或者为了同样的目的在计算机中使用 LFSR,即开始更高级的算法。

于 2021-12-26T17:47:12.390 回答