【问题标题】:Python Map Integer to Another "Random" Integer without RandomPython将整数映射到另一个没有随机的“随机”整数
【发布时间】:2021-05-09 08:44:05
【问题描述】:

假设给定一个 0 到 10000 范围内的输入整数。我想要一个一对一的函数,将该整数映射到同一范围内的另一个看似随机的整数。本质上,我想要这样的东西:

import random
random.seed(0)
out = list(range(10001))
random.shuffle(out)
mapper = {ii:oo for ii, oo in enumerate(out)}

>>> mapper[0]
6853
>>> mapper[1]
3631
>>> mapper[3]
421

唯一的问题是这个 Python 代码每帧执行数千次,所以我不想每次都打乱列表,因为这会减慢它的速度。但是我没有任何全局存储可以计算一次列表并访问每一帧(我在 Cinema 4D 中使用 Python 效果器,因此每个克隆都会执行整个 Python 脚本)。所以我需要另一个更快的解决方案来获得我正在寻找的东西。

我假设我可以使用一些更有效的数学函数来代替,它会得到非常相似的结果,本质上只是取一个整数并将其映射到给定范围内的另一个伪随机整数,同时产生相同的结果脚本运行的时间。有什么想法吗?

【问题讨论】:

标签: python random integer


【解决方案1】:

您正在寻找的是一个散列函数,以您感兴趣的范围为模。但是,python 中的默认散列函数对整数非常有效,因此它不会产生您正在寻找的“随机”效果为了。 CRC32 可能是一个不错的选择,而且速度非常快。

在较小输入范围内输出的完整示例是

import zlib

max_value = 10

for x in range(max_value):
    print(x, zlib.crc32(bytes(x)) % max_value)

然后您可以将其保存为字典,并在需要时查找该值

cached_hash = {x: zlib.crc32(bytes(x)) % max_value for x in range(max_value)}

哪个会更快,具体取决于您需要多少次找到一个 int 的随机 int 与 max_value 的大小相比

【讨论】:

    【解决方案2】:

    random.randint 最适合你,如果需要,你可以从中创建一个生成器:

    import random
    def random_integer(lower_bound, higher_bound):
      while True:
        yield random.randint(lower_bound, higher_bound)
    
    int_gen = iter(random_integer(0, 10001))
    
    # And then use it:
    
    >>> next(int_gen)
    6853
    >>> next(int_gen)
    9883
    >>> next(int_gen)
    7782
    ...
    

    【讨论】:

      猜你喜欢
      • 2014-05-15
      • 2018-11-06
      • 2021-07-12
      • 2012-04-29
      • 2018-04-03
      • 2014-05-21
      • 2013-11-20
      • 1970-01-01
      • 2010-11-25
      相关资源
      最近更新 更多