Python中是否有“sample”的生成器版本?

Python中是否有“sample”的生成器版本?,python,generator,netlogo,Python,Generator,Netlogo,NetLogo认为它的一个重要特性是,它以伪随机顺序从代理集激活代理。如果想在Python中做类似的事情,可以执行以下操作 from random import sample for agent in sample(agentset, len(agentset)): < do something with agent > 来自随机导入样本 对于样本中的代理(代理集,len(代理集)): 我相信那会很好。问题是sample返回一个列表。如果agentset很大,则实际上

NetLogo认为它的一个重要特性是,它以伪随机顺序从代理集激活代理。如果想在Python中做类似的事情,可以执行以下操作

from random import sample
for agent in sample(agentset, len(agentset)): 
    < do something with agent >
来自随机导入样本
对于样本中的代理(代理集,len(代理集)):
<用代理做点什么>
我相信那会很好。问题是
sample
返回一个列表。如果
agentset
很大,则实际上是在复制它。(我不想使用
shuffle
pop
,因为它们会修改原始代理集。)

理想情况下,我想要一个版本的
sample
,它充当生成器,并在请求时生成
的值。有这样的功能吗?如果没有,你有没有想过如何写一个——既不修改原稿也不复制原稿


谢谢。

作为样本基础的算法需要与样本大小成比例的内存。(一种算法是拒绝采样,另一种是部分洗牌。)这两种算法都不能满足您的要求

您所寻找的内容需要不同的技术,例如。保留格式的密码本质上是从[0,n)到[0,n”(或等价地,从任何有限集到自身)的键控双射

这将比传统的洗牌慢得多,但它会实现您指定的目标


我不知道有什么好的Python格式保存加密库。(
pyffx
存在,但测试表明。不管怎样,它似乎不适用于此。)您最好的选择可能是包装一个用不同语言实现的库。

也许您想在解决方案中使用
shuffle
方法。困难在于您需要跟踪剩下的或已经使用的内容,这两种方法都需要跟踪数据结构和输入的大小。你看过MESA或GAMA吗?它们都支持Python中的ABM,因此一定已经解决了问题。虽然我没有仔细阅读文档,但我所知道的ABM系统(Repast、MASON、MESA、GAMA和其他)都没有明确声明此功能。事实上,AFIK,甚至NetLogo都没有声明在不复制agentset或等效程序的情况下提供此功能。感谢您参考保留格式的加密。
def shuffle_generator(sequence):
    key = get_random_key()
    cipher = FormatPreservingCipher(key, len(sequence))
    for i in range(len(sequence)):
        yield sequence[cipher.encrypt(i)]