【问题标题】:Is it possible to make a true random number generator in TI-Basic?是否可以在 TI-Basic 中制作真正的随机数生成器?
【发布时间】:2020-01-25 02:42:03
【问题描述】:

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

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

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

【问题讨论】:

    标签: random ti-basic


    【解决方案1】:

    如果出于安全目的(意味着安全用户),如果您想知道这一点,请考虑 TI-BASIC 程序既可检查又可编辑。此外,当“受保护”(从 EDIT 菜单中隐藏程序)时,撤消操作就像首先“保护”程序一样容易。

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

    你可以像这样从 BASIC 中获取 R 的内容(你可以AsmComp(它以节省空间)

    :AsmPrgmED5FE63FEF8C47EFBF4AC9
    

    对应这个sn-p:

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

    如您所见,结果将在Ans

    只要用户不加修改地运行程序,他们就不太可能猜测结果(大约 1/64 的机会),更不可能直接影响它.

    【讨论】:

    • 我的第一个问题是,既然您提到了大会,那么该代码是否适用于 84+CE?我知道在 84 和 CE 之间更改了很多代码,错误的汇编代码会导致 RAM 清除。
    • @Himitsu_no_Yami sn-p 汇编代码将是相同的,但它会转换为 AsmPrgmED5FE63FEF7747EFAA4AC9
    【解决方案2】:

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

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

    【讨论】:

    • 那么有没有办法防止重新播种呢?出于我的目的,我会说这在功能上是等效的。
    • 我什至不确定我是否理解这个问题。您不控制设备上运行的软件吗?在您使用期间还有谁会重新播种 RNG?如果你的意思是有没有办法为不同的运行创建不同的种子,可能。我不知道 TI-BASIC,但可能有一种方法可以访问时钟,也许,并从中获取种子?或者也许是一种存储最后返回值并在下次运行时检索该值的方法?
    • 我很好奇这件事是否可行,但时钟的想法非常好,所以谢谢!
    猜你喜欢
    • 2013-06-12
    • 2016-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-15
    • 1970-01-01
    相关资源
    最近更新 更多