为了给两位(德国)教授留下深刻印象,我试图改进博弈论。
电脑游戏中的人工智能。博弈论:智能是一个受过良好教育的问题的经验证的答案。这意味着一个深思熟虑的决定是选择一个能带来最佳结果的行为。
Question -> Resolution -> Answer -> Test (Check)
例如,一个机器人正在与另一个机器人作战。这个机器人有3个选择:
-move forward
-hold position
-move backward
由此产生的程序非常简单
randomseed = initvalue;
while (one_is_alive)
{
choice = randomselect(options,probability);
do_choice(roboter);
}
我们使用伪随机性。
成功的检验很简单,就是他有没有淘汰对手。机器人有自动射击武器:
struct weapon
{
range
damage
}
struct life
{
hitpoints
}
现在进行一些进化。
我们让两个机器人互相战斗,并记住随机种子。一个成功的机器人的标志是什么?
struct {
ownrandomseed;
list_of_opponentrandomseed; // the array of the beaten opponents.
}
现在的问题是,我们如何选择正确的策略来对抗对手?我们假设我们对每种可能的种子策略都有最优的反策略。现在我们唯一要做的就是观察对手的数据,并计算出他的种子value.Then,我们就可以选择正确的策略。
对于破解随机生成器,我们可以使用手动方法:http://alumni.cs.ucr.edu/~jsun/random-number.pdf
或者是蛮力:https://jazzy.id.au/2010/09/20/cracking_random_number_generators_part_1.html
发布于 2017-03-17 22:18:04
这取决于用于生成(伪)随机数的算法。如果伪随机数生成器算法是已知的,您可以通过观察许多状态(机器人移动)来猜测种子。这类似于暴力猜测密码,用于加密,因为,一些加密算法被称为流密码,基本上(有时是准确的),用于混淆数据的一次性便签。现在,假设您知道使用的伪随机数生成器是一个简单的滞后斐波那契生成器。然后,你知道他们通过计算x(n) = x(n - 2) + x(n - 3) % 3来生成每个数字。因此,通过观察3个不同的机器人动作,你将能够预测所有未来的动作。种子是提供给您观察到的序列的前3个数字。现在,大多数随机数生成器都不是这么简单的,有些随机数生成器有高达1024位长的种子,现代计算机不可能以蛮力的方式循环所有这些可能性。所以基本上,你需要做的是找出使用的PRNG算法,找出所有可能的初始种子值,并设计一个算法来根据对手机器人的动作来确定他们正在使用的种子。根据算法的不同,有一些方法可以比测试每个种子更快地猜测种子。如果有更快的方法来猜测这样的种子,这意味着有问题的PRNG不适合密码应用程序,因为这意味着密码更容易猜测。AES256本身有一个突破,但理论上它仍然需要2^111次猜测(而不是2^256次猜测),这意味着从技术上讲,它已经被打破了,但是2^111对于现代计算机来说仍然太多了,无法在有意义的时间框架内处理。
如果PRNG落后于斐波纳契数(现在再也不用了,我只是举个简单的例子),并且你观察到机器人做了选项0,然后,1,然后2……然后你就会知道机器人下一步要做的是...1,因为0+ 1 %3=1。您还可以回溯,并计算出此PRNG的初始值是什么,它代表种子。
https://stackoverflow.com/questions/42867621
复制