Python 不包含';输出中没有可见的周期
在一个简单的基于瓷砖的图像中,如果每个区域的草在每个正方形上重复相同的草瓷砖,它看起来像一个可怕的云纹图案,但是如果三个或四个草瓷砖交替出现,它看起来异常自然 最好的方法是通过简单的坐标散列来选择每个图块。(另一种可能的实现是在游戏开始时随机选择它们,但如果可能的话,我更喜欢哈希函数。) 哈希函数的必要属性包括:Python 不包含';输出中没有可见的周期,python,hash,Python,Hash,在一个简单的基于瓷砖的图像中,如果每个区域的草在每个正方形上重复相同的草瓷砖,它看起来像一个可怕的云纹图案,但是如果三个或四个草瓷砖交替出现,它看起来异常自然 最好的方法是通过简单的坐标散列来选择每个图块。(另一种可能的实现是在游戏开始时随机选择它们,但如果可能的话,我更喜欢哈希函数。) 哈希函数的必要属性包括: 尽可能快(理想情况下类似于x+y mod N),不需要加密属性 输出上没有可见的周期:例如,x+y mod N失败,因为它总是在每行重复相同的N个分片 是否有一个简单的算术散列可以
- 尽可能快(理想情况下类似于x+y mod N),不需要加密属性
- 输出上没有可见的周期:例如,x+y mod N失败,因为它总是在每行重复相同的N个分片
hash(coords) % number_of_tiles
Python内置的hash()
函数并不是真正的伪随机行为,但出于这个目的,它可能已经足够好了
下面是一个具有7个瓷砖的示例:
>>> for x in range(10):
... for y in range(10):
... print ".oO^v<>"[hash((x, y)) % 7],
... print
...
O < o v . ^ > O > O
. v o < < O > ^ v o
< o > O . ^ o v O <
^ . O > o < . v > ^
o v . ^ ^ > O < v .
> ^ . v o < O > O >
. ^ o v < o > O v .
< O v o . v > ^ O >
v . ^ > O < o v . ^
O > ^ . . v o < < O
范围(10)内x的>>:
... 对于范围(10)内的y:
... 打印“.oO^v”[哈希((x,y))%7],
... 打印
...
OO>O
. VO<^VO
o.^o v o<
^ . O>O<。v>^
o v.^^>O ^ . voo>
. ^ oVoV。
^O>
五^>O^。vo<
我想试试
hash(coords) % number_of_tiles
Python内置的hash()
函数并不是真正的伪随机行为,但出于这个目的,它可能已经足够好了
下面是一个具有7个瓷砖的示例:
>>> for x in range(10):
... for y in range(10):
... print ".oO^v<>"[hash((x, y)) % 7],
... print
...
O < o v . ^ > O > O
. v o < < O > ^ v o
< o > O . ^ o v O <
^ . O > o < . v > ^
o v . ^ ^ > O < v .
> ^ . v o < O > O >
. ^ o v < o > O v .
< O v o . v > ^ O >
v . ^ > O < o v . ^
O > ^ . . v o < < O
范围(10)内x的>>:
... 对于范围(10)内的y:
... 打印“.oO^v”[哈希((x,y))%7],
... 打印
...
OO>O
. VO<^VO
o.^o v o<
^ . O>O<。v>^
o v.^^>O ^ . voo>
. ^ oVoV。
^O>
五^>O^。vo<
Doh!抱歉,我忘了说,感谢干净的方法,但这是我尝试过的方法之一,输出中有一个明显的mod-2循环——我推断它在执行简单的+或xor或类似操作。如果你认为这只是运气不好,我可以再试一次。@JackV:尝试使用不同数量的瓷砖–我添加了一个示例。Hm。你是对的,如果我限制(或填充)平铺的数量为7(或者可能是另一个素数),看起来还可以,即使2和4个平铺的输出是完全周期性的。我不能决定我是否喜欢这个答案。啊!抱歉,我忘了说,感谢干净的方法,但这是我尝试过的方法之一,输出中有一个明显的mod-2循环——我推断它在执行简单的+或xor或类似操作。如果你认为这只是运气不好,我可以再试一次。@JackV:尝试使用不同数量的瓷砖–我添加了一个示例。Hm。你是对的,如果我限制(或填充)平铺的数量为7(或者可能是另一个素数),看起来还可以,即使2和4个平铺的输出是完全周期性的。我不能决定我是否喜欢这个答案。你不能在生成瓷砖时生成随机数据吗?因此,您的“散列”将是randint
。您不能在生成分幅时生成随机数据吗?所以你的“散列”应该是randint
。