我了解python集的元素没有顺序。调用pop方法将返回一个任意元素;我很好。
我想知道的是,当集合具有相同的历史记录时,pop是否总是返回相同的元素。当然,在一个版本的python中,我不介意不同版本的python实现自己的事情。特别是,我问的是python
2.7。在这种情况下,这比api的实现问题更多。
我在游戏的程序地牢生成器中大量使用了set,我希望结果对于给定的种子是确定的。
答案通常是 不。*
@Christophe和@Marcin(un)指向的python源显示元素按照在哈希表中出现的顺序弹出。因此,弹出顺序(可能是迭代顺序) 是
确定性的,但仅适用于 固定的 哈希值。根据的文档中的 注释 ,数字就是这种情况,而字符串 不是
这种情况,顺便说一句,它也直接涉及到您的问题:
*__hash__
请注意,默认情况下,str,bytes和datetime对象的 hash
()值会以不可预测的随机值“成盐”。尽管它们在单个Python进程中保持不变,但是在重复调用Python之间它们是不可预测的。[…]
更改哈希值会影响字典,集合和其他映射的迭代顺序。Python从未保证过这种顺序(通常在32位和64位版本之间有所不同)。
编辑: 正如@Marcin指出的那样,我引用的链接不适用于Python2。哈希随机化已成为Python
3.3的默认设置。Python 2.7默认没有故意的非确定性字符串哈希。
通常,这对于哈希不是其值的可重复函数的任何对象(例如,如果哈希基于内存地址)都是一个问题。相反,如果您__hash__
为集合中的对象定义自己的方法,则可以期望它们将以可重复的顺序返回。(提供设备的历史记录和平台保持不变)。
问题内容: 在python文档中,“ set.pop()从s中删除并返回任意元素”。在生成一些随机数据以测试程序时,我注意到此pop()函数的异常行为。这是我的代码(python 2.7.3): 我在这里做的是 在每个元素的范围为[0,)的集合中插入一些随机值 从集合中弹出一个元素(根据文档,它应该是随机的) 计算集合中有多少元素小于弹出值 我希望弹出的值应该是随机数,并且集合中大约50%的数字会
问题内容: malloc 是确定性的吗?假设我有一个分叉的进程,即另一个进程的副本,并且在某个时候它们都调用了 malloc 函数。在两个过程中分配的地址是否相同?假设执行的其他部分也是确定性的。 注意:在这里,我只谈论虚拟内存,而不是物理内存。 问题答案: 完全没有理由要使它具有确定性,实际上,没有确定性可以带来一些好处,例如,增加利用漏洞的复杂性(另请参见本文)。 这种随机性可能有助于使漏洞更
Removes last element and returns it Returns: object element
当使用相同的JDK(即相同的可执行文件)时,生成的类文件是否总是相同的?是否会因操作系统或硬件的不同而有所不同?除了JDK版本之外,还有其他因素导致差异吗?有没有避免差异的编译器选项?这仅仅是理论上的差异,还是Oracle的实际上为相同的输入和编译器选项生成了不同的类文件? 更新1我感兴趣的是生成,即编译器输出,而不是类文件是否可以在各种平台上运行。 更新2同样的JDK,我也指同样的javac可执
本文向大家介绍确定性和非确定性算法之间的差异,包括了确定性和非确定性算法之间的差异的使用技巧和注意事项,需要的朋友参考一下 在编程的上下文中,“算法”是依次执行一组明确定义的指令,以执行特定任务并获得所需的输出。在这里,我们说一组定义的指令,这意味着如果某个指令以预期的方式执行,那么某个地方的用户就会知道这些指令的结果。 根据有关指令结果的知识,有两种算法,即-确定性算法和非确定性算法。以下是两种
问题内容: 当使用 相同的JDK (即相同的可执行文件)时,生成的类文件是否始终相同?取决于 操作系统 或 硬件 ,会有所区别吗?除JDK版本外,是否还有其他因素导致差异?是否有任何编译器选项来避免差异?是仅在理论上可能有所不同,还是Oracle 实际上针对相同的输入和编译器选项生成了不同的类文件? 更新1 我对 生成 感兴趣,即对编译器输出感兴趣,而不对是否可以在各种平台上 运行 类文件感兴趣。