Python - 获取随机颜色,尽可能快地给出种子数

我需要找到一个随机颜色,给定一个特定的种子号 - 快。两次给出相同的 ID,应该返回相同的颜色。


我这样做了:


def id_to_random_color(number):

    random_bytes = hashlib.sha1(bytes(number)).digest()

    return [int(random_bytes[-1]) / 255, int(random_bytes[-2]) / 255, int(random_bytes[-3]) / 255, 1.0]

问题是多次计算数字的 sha1 总的来说非常慢。(我使用这个功能大约 10 万次)


编辑:我使用散列函数的原因是我希望对于接近的数字使用不同的颜色


例如id_to_random_color(7)应该与id_to_random_color(9)


富国沪深
浏览 223回答 3
3回答

慕斯王

使用带有某种静态变量的简单随机数生成器可以提高性能:import randomprev, r, g, b = None, 0, 0, 0def id_to_random_color(number):    global prev, r, g, b    if number != prev:        r = random.random()        g = random.random()        b = random.random()        prev = number    return r, g, b, 1.0更新:正如 AndrewMcDowell 在他的评论中所述,如果输入在非连续情况下重复,则该函数可能返回不同的值。这是一个可能的解决方法:import randommemory = {}def id_to_random_color(number, memory):    if not number in memory:        r = random.random()        g = random.random()        b = random.random()        memory[number] = (r, g, b, 1.0)    return memory[number]进一步更新:甚至可以使用相同的函数框架来计算哈希:memory = {}def id_to_random_color(number):    if not number in memory:        numByte = str.encode(number)        hashObj = hashlib.sha1(numByte).digest()        r, g, b = hashObj[-1] / 255.0, hashObj[-2] / 255.0, hashObj[-3] / 255.0        memory[number]= (r, g, b, 1.0)        return r, g, b, 1.0    else:        return memory[number]尽管它的语法有点冗长,但该else语句提高了一点性能,避免了后续的内存写入和读取(如 Jake 在他的回答中所述)。

宝慕林4294392

我会使用字典来快速索引已经生成的种子。import randomrandom_seeds = {}def id_to_random_color(number):    if number in random_seeds.keys():        return random_seeds[number]    else:        color = [random.random(), random.random(), random.random(), 1.0]        random_seeds[number] = color        return color
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python