给定一个有限值的伪随机二进制序列(例如:00101010010101
),预测该序列将如何继续。有人可以告诉我最简单的方法吗?或者如果对于几乎不能在计算机上玩纸牌的人来说太难了,有人可以告诉我从哪里开始我的第一步...... PS:这种技术可以用来预测下一个电子轮盘号码的颜色(例如:分配1
和0
分别给红色和黑色)?
6 回答
加密安全的伪随机数生成器专门用于使您想做的事情变得不可能。特别是,它们满足“下一位测试”:给定k
其输出的位,您不能k+1
以大于 的概率猜测位1/2
。
不满足下一位测试的普通伪随机数生成器可能会受到攻击,事实上,由于选择了 PRNG,在现实世界的系统中已经发现了安全漏洞。特别是,已知线性同余生成器在某种程度上(或完全)可预测,并且某些版本的 Unix random 可能使用此算法。这种方法虽然是数学密集型的。如果你想走这条路,搜索“线性同余生成器预测”是一个开始的地方。
如果您知道 PRNG 实现,另一种攻击是尝试确定用于生成您正在分析的序列的种子。种子有时基于可猜测的信息,例如一天中的时间、进程 ID 等。
首先回答 PS:不,因为轮盘赌旋转是独立事件,因此在历史结果序列中没有任何预测性。
一般问题既难又有趣。这个网站可以从它们的初始值推断出数量惊人的序列:
http://www.research.att.com/~njas/sequences/
请注意,它适用于任意整数序列。
我在 {0,0,1,1,0,0,1,1,...} 之类的简单模式上进行了尝试,它说的是正确的。
好吧,对于伪随机序列,唯一的可能性是计算每种可能性之前有多少。如果 1 大于 0,则下一个为 0 的可能性更大。可能性的大小取决于每个的相对出现次数。
请注意,这不适用于真正的随机性,因为事件是独立的,尽管统计学家告诉你 :-)
当您使用双输方法玩轮盘赌时,您会(痛苦地)第一次在桌面上获得 13 个红牌。在任何情况下,房子都从既不是红色也不是黑色的 0 (在某些桌子上是双 0)中获得优势。
这是一个不错的问题,但我认为如果“你几乎不能玩纸牌”,那么它现在可能遥不可及。
您应该考虑学习一种基本语言,大多数人会说 PHP,但我对向初学者推荐它持谨慎态度(尽管它很容易上手,请参阅:XAMPP)。Java 可能是一种“易于运行和使用”的语言,但我确信这里有更好的线程来说明从哪种语言开始(Python 或其他东西可能会胜出,因为有经验的程序员喜欢它)。
顺便说一句,你的英语很好(我没注意到你的母语不是英语)。
现在,至于您的问题,如果您正在研究真正的模式匹配。我倾向于将这个想法转换为代码:
"CURRENTPOINT" is end of first letter.
LOOP: Pick letter(s) from Start to "CURRENTPOINT"
Break the rest of your binary string into blocks of the same size.
See if these blocks all equal your picked letters.
If not, move "CURRENTPOINT" along and repeat the LOOP until you run out of letters.
If so, you have your "repeating section."
如果您只是猜测随机生成器暂时存在偏差,并且这种偏差会在合理的短期内重新建立基线(平衡 0 和 1),那么您可以比较每个 0 和 1 的计数并说其他更有可能基于与您的基线的偏差。但是,要小心蒙特卡洛谬误。
你需要考虑的是随机性的属性,研究那些。例如,“随机性成束运行”。将随机序列与可预测序列进行比较:您通常不会在可预测序列中找到束。要利用束等待束。运气好的话,你会赢的。
我注意到没有人告诉你周期性。
伪随机序列始终适用于数学运算。(直到量子计算机^^)
生成一个通常的方法是将两个素数相除(不确定它是正确的词,但无论如何)。
例如
1/3=1.333333.....
9/7=1,2857142857142857142857142857143
这些都是相当小的数字,我们注意到了什么?周期性。
1/3=1.3 3 3 3 3 3.....
9/7=1,2857 142857 142857 142857 142857 143
素数越大,这种情况下的序列就越多:3 和 142857 会很大
因此,如果您长时间查看伪随机序列,您可能会发现一个周期性并能够“猜测”下一个数字。但这可能需要一段时间。
PS:对不起我的英语,我有点生疏了^^