3

对于我正在从事的项目,我希望能够生成和执行随机算法(相信我,这是有充分理由的!)根据 Alan Turings 的原始论文,每个 TM 都可以分配一个唯一的编号(更多现代理解这一点的方式是,每个程序都编译成一些唯一的二进制大长数字)。

假设我有这么长的号码。我现在如何执行这对应的程序?

语言在这里并不重要,如果它包含使这更容易的机制,我很乐意选择某种语言而不是另一种语言。如果无论您选择哪种语言都很难,那么我最精通Java。

如果您建议另一种生成随机算法的方法也可以,但请记住,我最终会更改逻辑以使用一些启发式方法而不是纯随机性来选择算法。

4

3 回答 3

2

“每个 TM 都可以分配一个数字”“每个数字都代表一个有效的、有意义的 TM”之间存在巨大差异。考虑包含一个简单程序的编译目标代码的二进制字符串,比如 2000 字节长。这是一个 8000 位数,其中大约有 10 个2400值。在几乎无限数量的值中,只有很小的一部分代表有效的可执行程序。随机生成一个生成任何可执行文件的机会几乎无限接近于零。

现在重复这个练习,比如说 6000 字节的程序。问题不是 3 倍难,而是大约 10 12000倍。等等...

于 2012-10-10T02:26:14.963 回答
1

这本质上是操作系统在您运行程序时所做的事情。它基本上将“二进制大长数”加载到内存中,然后从指令 0 开始执行程序。

http://en.wikipedia.org/wiki/Loader_(计算)

所以要执行你的随机算法,你可以在一个文件中生成随机数据,然后 exec() 该文件。

于 2012-10-10T02:11:01.773 回答
1

您需要做的是找出一种方法——任何方法——在给定整数的情况下生成程序。执行此操作的“标准”方法是选择一种任意编程语言,比如 Java,并想象每个可能的字符串对应于合法的、可编译的 Java 程序的文本,然后想象这些字符串按字母顺序排序。这是所有 Java 程序上定义明确的顺序,因此如果您只有这种顺序,您可以将列表中的任何数字转换为程序,只需在给定索引处获取程序即可。

不幸的是,这对算法来说不太实用。您必须枚举大量字符串才能到达列表中的第一个元素,更不用说元素 2134345423532243 或其他任何内容。每个程序都是一个字符串,但绝大多数字符串不是合法程序。将程序解释为巨大的二进制数时也存在同样的问题:每个程序都是一个数字,但几乎没有数字是程序。

因此,如果您真的对生成真正的程序感兴趣,而不是将所有时间都花在生成根本不是合法程序的虚假程序上,那么您需要更聪明地做一些事情。您可以这样做的一种方法是将您的数字作为随机数生成器的种子,然后根据对 RNG 的连续调用随机生成一条带有随机寄存器的汇编指令。

于 2012-10-10T02:24:09.967 回答