是否可以在 TI-Basic 中制作真正的随机数生成器?

Is it possible to make a true random number generator in TI-Basic?

有什么方法可以在 TI-84 计算器上创建一个 "true" 随机数生成器吗?我知道计算器中内置的是一个伪随机数生成器,但是否有可能创建一个真正的 RNG,以便无论用户想要什么来为内置 RNG 播种,结果始终是随机的且不可预测的即使他们在获得一组数字后用相同的种子重新播种?我最初的想法是像这样在 For 循环中使用 RNG 来随机化种子,但我突然想到通过播种初始 RNG 它仍然是可预测的。这是我使用的代码:

For(I,1,int(rand*100),1)
int(rand*100)→rand
End

但正如我所说,这没有用。

您误解了 "true" 与 "pseudo" 随机数生成器的区别。 任何确定性算法只能是PRNG。如果它在用相同的种子重新播种后没有产生相同的结果,那么它只是一个损坏的 PRNG,因为这就是种子的真正目的。

A "true" RNG 必须 有一些物理硬件熵源作为输入。这可以是反向偏置二极管、辐射源、麦克风噪声等。它还必须知道该源中有多少熵可用,并注意不要从可用输入中产生太多输出。大多数现代微处理器都有专门的硬件和指令。 Zilog Z80 没有。或许可以为此目的添加硬件。

如果出于安全目的(意味着 来自 用户的安全),请考虑 TI-BASIC 程序既可检查又 可编辑。此外,当 "protected"(从编辑菜单中隐藏程序)时,撤消操作与首先 "protect" 程序一样容易。

R寄存器的低位通常被认为是"random enough",当然它们并不是真正随机的,但在正常情况下它们很难预测,因为CPU执行的任何指令也会递增R 一定数量,并且在宏观尺度上很难预测 究竟 CPU 将执行什么。本质上它就像一个时钟,但它变化得更快,更难预测。

您可以像这样从 BASIC 中以可用的形式获取 R 的内容(您可以 AsmComp( 它以保存 space)

:AsmPrgmED5FE63FEF8C47EFBF4AC9

对应于这个片段:

ld a, r
and F
bcall(_SETXXOP1)
bcall(_StoAns)
ret

如您所见,结果将在 Ans.

只要用户运行程序不加修改,他们就不太可能猜到结果(大约1/64的机会),更不可能影响以一种有针对性的方式。

你不能只在 TI-BASIC 内。您需要一个外部源,例如麦克风噪音或辐射衰减或计算器之外的东西。计算机本身根本无法产生“真正的”随机性。如果您出于安全目的使用它,请记住 TI-BASIC 程序既可检查又可编辑。您可以“保护”它们,但破解保护所需的唯一方法是将程序传输到计算机并在 TI 的官方程序编辑器中打开它。所以,是的,不要使用 TI-BASIC 来保证安全。