1

编程新手,为了练习,我正在尝试编写易经预言机。我得到了我想要的输出,但只能将此代码块复制到我的程序中 6 次。

我可以设置一个循环条件以使其更简洁吗?

我已经阅读了有关循环的文档和 tuts,但还没有看到如何在这种情况下应用它。

import random 

oracle = random.randint(6,9)

if oracle == 6:
   print "__ __~"
elif oracle == 7:
 print "_____"
elif oracle == 8:
 print "__ __"
elif oracle == 9:
 print "_____~"   (X6)

=> 这是我得到的输出:

_____
__ __
__ __~
_____
_____~
__ __
4

5 回答 5

3

请注意,您的概率分布是错误的。

要读易经,你应该掷 3 个公平的硬币,每条尾巴 2 分,每头 3 分:

Coin1  Coin2  Coin3  Points
t      t      t      6
t      t      h      7
t      h      t      7
t      h      h      8
h      t      t      7
h      t      h      8
h      h      t      8
h      h      h      9

您可以看到有 3 种方法可以求和为 7 或 8,但只有一种方法可以求和为 6 或 9;因此分布应该是 6: 12.5%, 7: 37.5%, 8: 37.5%, 9: 12.5%。randint给出均匀分布,即每个 25%。

我建议如下:

from random import randint

xyin  = "__ __~"
yang  = "_____"
yin   = "__ __"
xyang = "_____~"

three_coins = [ xyin, yang, yang, yin, yang, yin, yin, xyang ]

def cast():
    return three_coins[randint(0, 7)]

def hexagram():
    return '\n'.join(cast() for i in range(6))

print hexagram()
于 2013-01-31T02:34:27.127 回答
1

使用这样的 for 循环结构:

import random 

for x in range(6):  # Loop 6 times
    oracle = random.randint(6,9)
    if oracle == 6:
       print "__ __~"
    elif oracle == 7:
       print "_____"
    elif oracle == 8:
       print "__ __"
    elif oracle == 9:
       print "_____~"   (X6)

更多关于范围函数的信息help(range)

range(...) range([start,] stop[, step]) -> 整数列表

Return a list containing an arithmetic progression of integers.
range(i, j) returns [i, i+1, i+2, ..., j-1]; start (!) defaults to 0.

您也可以使用while构造来实现相同的效果。

start = 0
stop = 6
while start < stop:
    #Your code-block here
    start = start+1
于 2013-01-30T22:04:13.777 回答
1

像这样的东西?

import random 

for n in range(6):
  oracle = random.randint(6,9)
  if oracle == 6:
    print "__ __~"
  elif oracle == 7:
    print "_____"
  elif oracle == 8:
    print "__ __"
  elif oracle == 9:
    print "_____~"

输出:

__ __
__ __~
_____~
__ __~
_____~
于 2013-01-30T22:09:15.700 回答
1

你可以使用这样的while循环:

import random 

counter = 0

while counter < 6:
    oracle = random.randint(6,9)

    if oracle == 6:
       print "__ __~"
    elif oracle == 7:
       print "_____"
    elif oracle == 8:
       print "__ __"
    elif oracle == 9:
       print "_____~"

    counter += 1
于 2013-01-30T22:12:40.587 回答
0

您还可以用字典替换 and 的堆栈,ifelif列表理解替换循环,并将其减少到只有几行

d = {6: "__ __~", 7: "_____" , 8: "__ __" , 9: "_____~",}
print '\n'.join([d[random.randint(6, 9)] for j in range(6)])
于 2013-01-30T22:21:02.880 回答