Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 不包含';输出中没有可见的周期_Python_Hash - Fatal编程技术网

Python 不包含';输出中没有可见的周期

Python 不包含';输出中没有可见的周期,python,hash,Python,Hash,在一个简单的基于瓷砖的图像中,如果每个区域的草在每个正方形上重复相同的草瓷砖,它看起来像一个可怕的云纹图案,但是如果三个或四个草瓷砖交替出现,它看起来异常自然 最好的方法是通过简单的坐标散列来选择每个图块。(另一种可能的实现是在游戏开始时随机选择它们,但如果可能的话,我更喜欢哈希函数。) 哈希函数的必要属性包括: 尽可能快(理想情况下类似于x+y mod N),不需要加密属性 输出上没有可见的周期:例如,x+y mod N失败,因为它总是在每行重复相同的N个分片 是否有一个简单的算术散列可以

在一个简单的基于瓷砖的图像中,如果每个区域的草在每个正方形上重复相同的草瓷砖,它看起来像一个可怕的云纹图案,但是如果三个或四个草瓷砖交替出现,它看起来异常自然

最好的方法是通过简单的坐标散列来选择每个图块。(另一种可能的实现是在游戏开始时随机选择它们,但如果可能的话,我更喜欢哈希函数。)

哈希函数的必要属性包括:

  • 尽可能快(理想情况下类似于x+y mod N),不需要加密属性
  • 输出上没有可见的周期:例如,x+y mod N失败,因为它总是在每行重复相同的N个分片
是否有一个简单的算术散列可以工作,并且比“seed(coords);returnrandomRange(N)”更简单,但是如果输入是“(0,0)”、“(1,0)”、“(2,0)”。。。输出中没有可见的模式

在游戏开始时生成一些随机数据以供使用是否更好

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