2015-12-10 36 views
-3

我目前正在尝试创建一个具有一个项目(代表游戏内)的随机机会的方法,例如一个项目的20%,或50%的百分比,甚至1%。百分比pythonic方式

from random import randint 

def Break(): 
    print(".") 

def Treasure(): 

    Gen = randint(1,100) 
    if Gen <= 10: 
     print("10%") 
     Break() 

    Gen = randint(1,100) 
    if Gen <= 10: 
     print("10%") 
     Break() 

    Gen = randint(1,100) 
    if Gen <= 10: 
     print("10%") 
     Break() 

    Gen = randint(1,100) 
    if Gen <= 10: 
     print("10%") 
     Break() 

    Gen = randint(1,100) 
    if Gen <= 10: 
     print("10%") 
     Break() 

此代码方法这类作品的,问题是,即使选择从这里百分比和休息()被调用,还有的可能:我曾尝试与如下所示的代码做这个它有超过一个百分比列出 因此,如果它说80%,然后Break() 它也可以列出50%,然后Break()一段时间。

所以我的问题是,我怎么能做到以下几点:

  • 比较有效的代码
  • 使百分比只能拨打ONE再突破()
  • 使得百分比肯定的方式是什么他们说,例如50%的一半机会。

测试代码:(编辑)

if gen <= 10: 
    print("10%") 
elif gen <= 20: 
    print("20%") 
elif gen <= 30: 
    print("30%") 
elif gen <= 40: 
    print("30%") 
elif gen <= 50: 
    print("50%") 
elif gen <= 60: 
    print("60%") 
elif gen <= 70: 
    print("70%") 
elif gen <= 80: 
    print("80%") 
elif gen <= 90: 
    print("90%") 

如果这没有使90%的最有可能的,反过来10%的最少?

+2

我不完全确定你在问什么。如果你想要一个随机的机会,为什么不使用'print(str(randint(1,100))+'%')'? – Holloway

+0

如果你想早点离开功能,你的'Break'实际上并不会中断,使用'return'。 – Holloway

+0

你可能只需要一个生成,如果elif和其他语句而不是多个生成和if语句 – NendoTaka

回答

2

几件事情第一:

  • 资本事宜; breakBreak是两个不同的东西

  • break是一个关键字,而不是一个函数;称之为break而不是break()

  • break是退出循环,但不在循环中;也许你的意思是return

你是级联的情况下抛出的百分比注销的方式:

gen = randint(1,100) 
if gen <= 10: 
    return "10% (#1)" 

gen = randint(1,100) 
if gen <= 10: 
    return "10% (#2)"  # 10% of 90% == 9% 

gen = randint(1,100) 
if gen <= 10: 
    return "10% (#3)"  # 10% of 81% == 8.1% 

对于需要累计测试正确的价值观,像

gen = randint(1, 100) 
if gen <= 10: 
    return "10% (#1)" 
elif gen <= 20: 
    return "10% (#2)" 
elif gen <= 30: 
    return "10% (#3)" 

或许,这将节省大量的加重包装这一类,就像

from bisect import bisect # fast binary search 
from random import random 

class RandomItemGenerator: 
    def __init__(self, items=None, probs=None): 
     # start with no items 
     self.items  = [] 
     self.total  = 0. 
     self.breakpoints = [] 
     # add any initial items 
     if items is not None: 
      for item, prob in zip(items, probs): 
       self.add_item(item, prob) 

    def add_item(self, item, prob): 
     self.items.append(item) 
     self.total += prob 
     self.breakpoints.append(self.total) 

    def __call__(self): 
     if self.items: 
      value = random() * self.total 
      index = bisect(self.breakpoints, value) 
      return self.items[index] 
     else: 
      raise ValueError("you haven't got any items yet") 

那么你的代码看起来像

make_treasure = RandomItemGenerator() 
make_treasure.add_item("sword", 80) 
make_treasure.add_item("sword +1", 19) 
make_treasure.add_item("ring +2", 1) 

,我们可以测试像

from collections import Counter 

# generate 10,000 items 
test = Counter(make_treasure() for i in range(10000)) 

# check number of each item generated 
print(test.most_common()) 

这给像

[('sword', 8002), ('sword +1', 1887), ('ring +2', 111)] 

编辑:一个例子返回功能:

def sword_fn(): 
    # your stuff goes here 

def dagger_fn(): 
    # your stuff goes here 

def wand_fn(): 
    # your stuff goes here 

make_fn = RandomItemGenerator() 
make_fn.add_item(sword_fn, 80) 
make_fn.add_item(dagger_fn, 19) 
make_fn.add_item(wand_fn, 1) 

which = make_fn()  # pick a function 
which()    # run the function 

我最后的评论中使用的等同的简写,就像

make_fn = RandomItemGenerator([sword_fn, dagger_fn, wand_fn], [80, 19, 1]) 

这不正是同样的事情上面的四条线,我在那里创建实例,然后添加项目。

+0

我编辑了我的代码,你可以看到百分比是否会起作用? – Csarg

+0

make_treasure.add_item(“ring +2”,1)是否意味着'1'是机会?和+2的金额? – Csarg

+0

另外,如何在创建其中一个宝藏时使其执行一个功能? – Csarg

0

你可以尝试这样的事情:

def Break(): 
    print(".") 

def FindAnotherName(): 
    Gen = randint(1,100) 
    if Gen <= 10: 
     print("10%") 
     Break() 
     return True 
    else: 
     return False 

def Treasure(): 

    i = 0 
    finished = False 
    while (i < 5 && finished == False): 
     finished = FinAnotherName() 
     i = i + 1