20个模具投掷的随机模拟

时间:2018-04-28 03:52:19

标签: python

试图模拟20个骰子随机抛出,代码需要用括号括起一个相同的值,括号出现,但我在公式上遗漏了一些东西,任何建议都可以大大帮助,例如:

1 ( 4 1 ) 2 3 6 1 4 3 2 6 6 6 5 6 2 1 3 5 3 # incorrect
1 4 1 2 3 6 1 4 3 2 ( 6 6 6 ) 5 6 2 1 3 5 3 # this is a correct example 
def main():

    exampleList = [ ]

    for i in range(20):
        exampleList.append(randint(1, 6))
    print(exampleList)
    print(list(range(0,20)))

    max_count = 0
    run_count = 0

    matched = False #inRun = False           
    # find max run
    for rollValue in exampleList:
      #print(rollValue)
      if run_count == 19:
          print()

      else:          
          print("-------")
          print("Roll Value %s" % exampleList[run_count])
          print("Position   %s" % run_count)
          print("Next Roll value %s" % exampleList[run_count + 1])
          if exampleList[run_count] == exampleList[run_count + 1]:
             matched = True
             print("------->>>matched")
          else:
             matched = False#inRun = False
          run_count += 1

      if rollValue < 19:
          if exampleList[rollValue] == exampleList[rollValue + 1]:
             run_count += 1
          if matched == False:
              matched == True
              run_count = rollValue

          else:
            matched = False
          if run_count > max_count:
             run_count = 1
    # print sequence
    for rollValue in range(20):
       if rollValue == run_count:
               print("(", exampleList[rollValue], end = " ")

       elif rollValue == run_count + max_count + 1:
            print(exampleList[rollValue], ")", end = " ")

       else:
            print(exampleList[rollValue], end = " ")            
main()

5 个答案:

答案 0 :(得分:2)

这是使用正则表达式的解决方案。这会在骰子卷上创建一个字符串,然后找到重复的数字并使用re.sub添加括号。

import re
import random

rolls = ''.join(map(str, [random.choice(range(1, 7)) for _ in range(20)]))
rolls = ' '.join(re.sub(r'(\d)(\1+)', r'(\1\2)', rolls))
print(rolls)

一些样本运行:

4 1 4 3 4 6 5 2 3 ( 5 5 ) 1 6 4 3 5 2 5 ( 4 4 )
2 ( 1 1 ) 4 1 ( 5 5 ) ( 3 3 ) 6 2 ( 1 1 ) 5 1 4 3 4 ( 5 5 )

正则表达式解释:

(                             // start of matching group 1
  \d                          // matches a single digit
)                             // end of matching group 1
(                             // start of matching group 2
  \1+                         // matches group 1, 1 or more times
)                             // end of matching group 2

答案 1 :(得分:0)

您的代码存在许多问题,因此重写整个内容的速度更快。

{{1}}

正如您所看到的,我通过使用变量来跟踪我是否在括号内。我期待下一个数字来猜测我是否应该添加一个右括号。

最后一个案例由try-except处理。

您还可以通过向前和向后查看来处理每个号码,但这需要您为try-except部分添加一些额外条件,因此这只是

答案 2 :(得分:0)

有多种方法可以做到这一点,但这与你刚才做的最相似。基本上只是迭代滚动列表的索引。我们检查每个数字以查看它是否与之前的数字相同,如果是,那么我们递增计数并继续前进。如果没有,那么我们添加了许多该数字在计数中的输出。如果有的话,我们会在括号中单独写出来,如果更多的话。

exampleList = [randint(1, 6) for i in range(20)]

# the current number that could be a potential sequence
current = exampleList[0]
# count for the number of occurences in a sequence (often 1)
count = 1
# The string to outpu
output = ''

# Iterate over the rolls, ignoring the first one
for i in range(1, len(exampleList)):

    if exampleList[i] == current:
        count += 1
    else:
        if count > 1:
            output += ('(' + count * str(current) + ')')
        else:
            output += str(current)
        current = exampleList[i]
        count = 1

# Handle final addition
if count > 1:
    output += ('(' + count * str(current) + ')')
else:
    output += str(current)

print(output)

输出:

64(66)15253(66)2143454(22)

答案 3 :(得分:0)

这会将括号添加为列表的一部分:

#!/usr/bin/python

import sys
from random import randint


# add parenthesis as part of the list
def main():

    exampleList = [ ]
    previous = -1
    opened = False

    for i in range(20):
        roll = randint(1, 6)
        if roll == previous:
            if not opened:
                exampleList.insert(-1, '(')
                opened = True
        else:
            if opened:
                exampleList.append(')')
                opened = False
        exampleList.append(roll)
        previous = roll
    if opened:
        exampleList.append(')')
    for item in exampleList:
        sys.stdout.write('{0} '.format(item))
    sys.stdout.write('\n')


if __name__ == '__main__':
    main()

示例:

( 2 2 ) 4 5 1 2 1 ( 6 6 ) 1 6 1 4 1 ( 6 6 ) 1 6 2 4 
2 ( 6 6 ) ( 1 1 ) 3 2 1 ( 4 4 ) 1 2 5 4 1 5 3 ( 5 5 5 )

答案 4 :(得分:0)

逻辑错误是您混淆&#34;运行开始的索引&#34;用&#34;(最后)运行的长度&#34;。

您需要一个像max_run_start_index这样的变量。

查看代码:

if rollValue == run_count:
    print("(", exampleList[rollValue], end = " ")

如果下一个输出的索引等于 last 运行的长度,请在它之前输出开放括号&#39>将它读回给自己&#39; ;

因此,如果最后一次运行的长度是3,则最长运行从索引3开始? 当然不是......

我不是Python程序员,所以你需要自己解决它...