0

目标是模拟高辐射环境。

通常,代码如下:

a = 5
print(a)
print(a)

会打印:

5
5

我希望能够a在运行时随机更改底层字节表示(根据一些采用种子的预定义函数)。在这种情况下,以下代码:

a = RandomlyChangingInteger(5)
print(a)
print(a)

可能导致:

4
2

对于像 C 和 C++ 这样的语言,可以这样做的一种方法是在编译代码中的a每次使用之前插入可能修改的额外指令。我正在考虑aBITFLIPS (使用 valgrind)这样的东西。

这在 Python 中甚至可能吗?

4

2 回答 2

1

你可以做到,有点。内置int是不可变的,因此您不能修改它的值。但是,您可以创建一个模拟的自定义类int

import random


class RandomlyChangingInteger(object):
    def __int__(self):
        return random.randint(0, 10)

    def __str__(self):
        return str(self.__int__())

然后

a = RandomlyChangingInteger()
print(a)
print(a)

应该打印类似的东西

4
5

请注意,您不能使用此类进行数学运算。您必须先实现其他int方法(例如__add__,__mul__等)。

于 2020-07-10T05:44:45.827 回答
1

您正在尝试模拟辐射引起的位翻转,但您对它的预期效果与目标相去甚远。与将对象的值更改为另一个有效值相比,辐射效应更有可能使 Python 程序崩溃。这使得模拟辐射效应不是很有用。

CPython 实现依赖于如此多的指针和如此多的间接性,以至于在数据中翻转几次之后,其中至少一个几乎肯定会碰到导致崩溃的东西。可能会破坏对象的类型指针,导致下次尝试对该对象执行几乎任何操作时内存访问错误,或者可能破坏引用计数,导致对象在仍在使用时被释放。可能会破坏 int 的长度(Python int 是可变宽度的),导致 Python 尝试读取分配结束后的内容。

C 整数数组可能只是一个巨大的数值数据块,可以检测或管理随机位损坏,而 Python 整数列表主要是指针和其他元数据。

如果您真的想模拟随机位翻转,最好的方法可能是使用您链接的 BITFLIPS 之类的工具重新构建 CPython。

于 2020-07-10T05:45:01.060 回答