阻止选择相同的数据池随机.shu

2024-04-18 05:58:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一个代码,看在一个多轮游戏的选择游戏。有四个选项(A、B、C、D)和四个支付池(池1、池2、池3和池4)。每轮都有一个选择。每个选项分配到一个池(A-池1等)。你知道吗

我想随机洗牌池一旦6个选项中有5个是相同的(例如AAABAA或BCBBBB->;例如,将池1更改为除池1以外的任何其他选项)。此外,每20轮应该有一次自动洗牌,以确保即使6次选择5次都没有选择,池仍然会改变。你知道吗

目前,我已经将其编码为在连续5次(连续5次选择)之后池会发生变化。我只是不想在每20轮就有5/6的选择(已经完全相同)和一次改变之后,让泳池改变,而且有时同一个泳池又会被随机选择,这是我不想要的。你知道吗

if (streak % 5) == 0 : pools = [pool_1, pool_2, pool_3, pool_4] random.shuffle(pools)

work1 = pools[0]
work2 = pools[1]
work3 = pools[2]
work4 = pools[3]

任何帮助都很感激-谢谢!你知道吗


Tags: 代码gt游戏编码if选项randompool
1条回答
网友
1楼 · 发布于 2024-04-18 05:58:20

条纹跟踪

要确定最后六个选项中的五个是否相同,可以使用deque来跟踪最后N个选项。你应该把limit the size改成6。无论何时做出选择,都要将选择附加到您的文档中。你知道吗

from collections import deque
from collections import Counter

last_three_choices = deque('', maxlen=3)  # using 3 for brevity
last_three_choices.append('A')            # User picked A. History is now A
last_three_choices.append('B')            # User picked B. History is now AB
last_three_choices.append('C')            # User picked C. History is now ABC
last_three_choices.append('A')            # User picked A. History is now BCA
last_three_choices.append('C')            # User picked C. History is now CAC

在附加选项之后,根据您的需求做一个Counter,以确定每个选项已经做了多少次。筛选只包含值为5或更多的键(最多应该有一个!)如果有的话,在过去的六次试验中已经做了五次选择。你知道吗

two_out_of_three = deque('CAC')                           # Restoring state from above
streakyness = Counter(two_out_of_three)                   # This will be {'C':2, 'A':1}
streaked = {k:v for (k,v) in streakyness.items() if v>=2} # This will just be {'C':2}

然后,您可以使用Python将空字典处理为False来提取有问题的选择,并在出现连串时执行洗牌:

if streaked:                             
  repeated_choice = next(iter(streaked)) # Retrieve the key
  do_shuffle_thing(repeated_choice)      # Invoke your shuffling procedure

对抗性洗牌

对于不完全随机的洗牌,其中一个特定的元素(有条纹的元素)保证没有一个特定的最终位置(它的原始位置),假设你真的只处理少量的选择,你基本上可以使用一个bogosort和一个非常宽松的“顺序”标准:

pool_to_move = pools[repeated_choice]
while pools[repeated_choice] == pool_to_move:
  random.shuffle(pools)

每次通过,你有六分之一的机会得到需要重新洗牌的坏洗牌,所以在N次迭代之后,你只有6^N的机会需要继续进行。理论上它可能永远持续下去,但是除非你的RNG倾向于讨厌那些exploding dice的游戏,否则它应该很快终止。你知道吗

您可能会注意到,我假设pool是一个以选项为键的字典,而不是您得到的列表。但不用担心:shuffling dictionary keys是可行的。你知道吗

相关问题 更多 >