【问题标题】:Roulette game win streak counter轮盘游戏连胜计数器
【发布时间】:2022-01-08 06:36:45
【问题描述】:

我想请求你的帮助。

任务

有 50 次观察对象玩过的“轮盘赌游戏”。鉴于输赢的数据是已知的(我有时间序列),并且他的总资本值在每场比赛后都会增加和减少,我想计算总赢/输次数和长度平均连胜(假设起始资金为 100,因此时间序列为 - series = [102,104,106,105,108,109,120,115,116,118,120,122,..].. 在这种情况下,第一个连胜将是 3)。

我对此很陌生,我自己创造了这个谜语来挑战我的逻辑思维,但在我看来,我完全迷失了,这也让我感到沮丧。

我想在这个练习中修改我对循环和条件的了解,所以它不应该包含任何其他内容。

您能否就如何做到这一点给我一个建议?我试着这样想,但最后对我来说真的没有意义..

for i in range (0, len(series)-1):
   while series[i] < series[i+1]:        #While the following game brings profit
      counter_win = counter_win + 1      #The counter of good games should increase by 1 
   break

现在我找不到如何从下一个数字序列的开头重新开始的方法。

谢谢大家,因为我现在迷路了。

【问题讨论】:

  • 您是否希望在检测到连胜结束时增加计数器 (series[i] &gt; series[i+1])?
  • 此外,您需要跟踪所有条纹的长度,然后您可以计算平均值。或者您可以在不存储所有条纹长度的情况下随时计算平均值
  • 还要小心:„ 102,104,106,105,108,109,120,115,116,118,120,122,..].. 在这种情况下,第一个条纹是 3。)“第一个条纹长度实际上是 2

标签: python for-loop if-statement while-loop


【解决方案1】:

我建议使用以下代码:

current_streak = 0
streaks = []
for i in range (0, len(series)-1):
   if series[i] < series[i+1]:        
      current_streak += 1
   elif current_streak > 0:     
      streaks.append(current_streak)
      current_streak = 0

# edge case if the game ends with a streak
if current_streak > 0:
    streaks.append(current_streak)


print("{} Steaks with the average length {}".format(len(streaks), sum(streaks)/len(streaks)))

要计算损失的数量,您可以使用相同的方法

【讨论】:

  • 这个效果非常好,我什至无法想象!你介意给我一些关于如何在编码中思考的资源或建议吗?任何可以帮助的事情,因为我觉得这永远不会出现在我的脑海中......
【解决方案2】:

您示例中的嵌套循环将计算3 的第一次连胜。作为3 的连胜,然后是2 的连胜,然后是1 的连胜。使用它来获取连胜记录:

input_ = [100,102,104,106,105,108,109,120,115,116,118,120,122]

win_streak = 0
win_streaks = []
for i in range(1, len(input_)):
    if input_[i] > input_[i-1]:
        win_streak += 1
    elif win_streak > 0:
        win_streaks.append(win_streak)
        win_streak = 0
if win_streak > 0:
    win_streaks.append(win_streak)
average = sum(win_streaks) / len(win_streaks)
print(average)

【讨论】:

  • 这很好用,谢谢!我只是不明白这一行,您能否向我解释一下它的作用,因为您已经在 for 循环中拥有它?如果 win_streak > 0: win_streaks.append(win_streak)
  • win_streaks 是一个列表,调用win_streaks.append() 会将给定的参数添加到列表的末尾。所以win_streaks.append(win_streak) 会将win_streak 的当前值追加到列表中。
【解决方案3】:

Hire 是一段代码,展示了解决问题的可能方法。 该代码旨在具有指导意义,因此未进行优化也便于理解:

data = [102,104,106,105,108,109,120,115,116,118,120,122]

# menages control between win and lose streak 
boolean = False

# actualy counts the number of consecutive wins and loses
counter = 0

# Store the lenght of streak 
win = []
lose = []

for i in range(1, len(data)):
    if data[i] > data[i - 1]:
        #If we were losing and we won one time add streak to array if needed and reset  
         #counter
        if boolean is False:
            if counter != 1:
                lose.append(counter)

                counter = 1
           # Change boolean to address win streak
            boolean = True
        else:
            counter += 1
    if data[i] < data[i - 1]:
        # Same as before but with opposite signs 
        if boolean is True:
            if counter != 1:
                win.append(counter)

                counter = 1
            boolean = False
        else:
            counter += 1
average_win=0
average_lose=0
for i in win:
    average_win+=i
for i in lose:
    average_win+=i


print(average_win/len(win))
print(average_lose/len(lose))


【讨论】:

  • 我真的很喜欢你写这段代码的方式!对我来说很有意义,谢谢!!我只是想确保我理解..您的代码主要检查资本是更高还是更低,并且取决于我们所处的连续性 - 它要么增加序列,要么重新开始,对吗? if counter != 1 是从一种状态到另一种状态的转换。
  • Counter !=1 在检测到趋势变化时检查转换是否实际上有任何连续运行
【解决方案4】:

这是一种方法。它并不漂亮,但它完成了工作。 :)

如果有更多时间,我会将其拆分为单独的功能等。

series = [102,104,106,105,108,109,120,115,116,118,120,122]

runs = {}
streak, last = 0, 0 # streak is key variable here as it goes negative for loss-streak
o = 1 # run-counter for our dictionary
for i in series:
    if i > last and last: # first entry isn't a win right?
        # Win
        if streak < 0: # Winds have changed. Reset streak.
            streak = 0
            o += 1
        if o in runs: runs[o] += "w"
        else: runs[o] = "w"
        streak += 1
    elif i < last and last:
        # Loss
        if streak > 0: # Winds have changed. Reset streak.
            streak = 0
            o += 1
        if o in runs: runs[o] += "l"
        else: runs[o] = "l"
        streak -= 1

    last = i

high = sorted([ len(x) for x in runs.values() if "w" in x ],reverse=True)[0]
low = sorted([ len(x) for x in runs.values() if "l" in x ],reverse=True)[0]
print(f"Biggest win spree: {high}, loss spree: {low}")

average_wins = [ len(x) for x in runs.values() if "w" in x ]
print("Average winstreak:",round(sum(average_wins)/len(average_wins),1))

希望这对您有所帮助。祝你有美好的一天!

编辑:您实际上并不需要 record_low&high 来考虑它。更新了一些爱好者。 :)

【讨论】:

  • 首先感谢您的宝贵时间!因为我是业余爱好者,所以我花了一些时间阅读它,每行都要读十遍:)。您能否解释一下第一个 if 语句中的“and last”条件是什么意思?我真的看不出来。谢谢!!!
  • @Martin 第一次进入 for 循环时,last 尚未获得正确的值;从我们设置它开始,它仍然为 0,因此它是错误的;它只是跳过第一个条目(不认为这是一个胜利吗?),在下一次迭代中它将具有最后一个值并且是真的......如果这有意义:)
【解决方案5】:

函数式编程解决方案:

from itertools import groupby

inp = [100,102,104,106,105,108,109,120,115,116,118,120,122]

streaks = list(filter(lambda x: x != 0,
                   map(lambda x: sum(x[1]),
                       groupby(map(lambda x,y : x < y, inp, inp[1:])))))

print(streaks, sum(streaks)/len(streaks))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-27
    相关资源
    最近更新 更多