Python - For Loop和If Statement计算硬币投掷的概率

时间:2017-02-06 06:32:35

标签: python if-statement for-loop probability

这里的Python很新。我正在尝试计算有偏见的抛硬币发生事件的条件概率。除了 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/content_spare_request" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/root1" android:layout_margin="10dp" android:orientation="vertical" android:layout_marginBottom="20dp" android:background="#fff"> <RelativeLayout android:layout_width="match_parent" android:layout_height="50dp" android:orientation="horizontal"> <TextView android:id="@+id/spare_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="5dp" android:layout_marginStart="2sp" android:layout_marginTop="07dp" android:paddingLeft="10dp" android:text="@string/tip_brush_size" android:textAppearance="?android:attr/textAppearanceLarge" android:textColor="@color/facebook" android:textSize="16sp" /> <Button android:id="@+id/btn_spare" android:layout_width="20dp" android:layout_height="match_parent" android:background="@color/facebook" android:layout_alignParentRight="true" android:minHeight="0dp" android:minWidth="0dp" /> </RelativeLayout> <View android:id="@+id/view2" android:layout_width="match_parent" android:layout_height="3dp" android:layout_below="@+id/spare_text" android:background="@color/facebook" android:gravity="center" /> <android.support.v7.widget.RecyclerView android:id="@+id/spare_recyclerview" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/view2" /> <TextView android:id="@+id/empty_view" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_alignParentBottom="true" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:gravity="center_horizontal" android:paddingBottom="75dp" android:text="No Data Available" android:visibility="visible" /> </LinearLayout> 部分之外,我已经找到了大部分代码 - 具体来说,我不确定是使用if statement还是pass。更具体地说,我希望分母能够反映满足要求的迭代次数,而不是迭代总次数。

例如,假设我想计算6组的概率,假设我们在10次硬币翻转后超过5组 - 该函数将读作continue,其中参数代表1000次迭代,10次硬币投掷,分别为6组和5组。让我们假设只有500次迭代符合要求 - 因此,simulate_three(1000,10,6,5)的分母是500,而不是1000.但是,我不确定代码是否正常工作......

Outcome

2 个答案:

答案 0 :(得分:1)

python文档有a great section on control flows.简而言之,pass用作排序占位符,而continue将继续下一次迭代。

根据我对您的描述的理解,您需要continue pass。所以正确的版本看起来像:

    if len(list(groupby(flips))) <= Z:
        continue
    Outcome.append(len(list(groupby(flips))))

更可读,更明确的版本可能是:

    if len(list(groupby(flips))) <= Z:
        pass
    else:
        Outcome.append(len(list(groupby(flips))))

当然,最直接的版本可能是:

    if len(list(groupby(flips))) > Z:
        Outcome.append(len(list(groupby(flips))))

因此,在这种情况下,只有当list的长度大于Z时才会将其添加到Outcome

您可以通过强制flip函数仅返回H来测试此问题。如果控制流程按预期工作,您将在倒数第二行上抛出除以零的错误。

答案 1 :(得分:0)

我认为您的代码包含更多错误,例如您需要使用浮点除法而不是整数除法(适当的类型转换)和条件概率计算公式需要更正,你计算的概率实际上是z得分,假设大量的IID变量试验,这里是修改后的代码,我认为它对你有用:

import random
from itertools import groupby
import statistics
import matplotlib.pyplot as plt
import numpy as np

# Function for biased coin
def flip(p): return 'H' if random.random() < p else 'T'

# Simulation
def simulate_three(X, N, Y, Z):
    Outcome = [] # List of results
    for i in range(X): # For loop for the X number of iterations
        flips = [flip(0.6) for j in range(N)] # For loop for N number of coin flips
        #print len(list(groupby(flips))), flips
        if len(list(groupby(flips))) > Z: # If group condition is met
           Outcome.append(len(list(groupby(flips)))) # store to list
    prob = (1.0*len(filter(lambda x:x == 6, Outcome))) / len(Outcome) # conditional probability
    expval = (1.0*sum(Outcome))/(len(Outcome)) # conditional expectation
    zscore = (Y - expval) / statistics.stdev(Outcome) # by CLT, assuming IID variables, compute the z score
    print prob
    print expval
    print zscore
    weights = (1.0*np.ones_like(Outcome))/len(Outcome)
    plt.hist(Outcome, weights=weights, facecolor='green', alpha=0.75)
    plt.xlabel('#Groups')
    plt.ylabel('Conditional Probability of Groups | (> 5 groups)')
    plt.title('Conditional Probability Distribution')
    plt.grid(True)
    plt.show()

simulate_three(1000,10,6,5)
# 0.551198257081 : this is the conditional probability
# 6.64052287582  : this is the conditional expectation
# -0.773961977708 : this is the z-score

enter image description here