如何用Python生成计算题?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何用Python生成计算题?相关的知识,希望对你有一定的参考价值。

输入题目数量、数字范围,自动生成相应的计算题,并且判断正误,代码尽可能简单点...初学者伤不起啊

这道题我回答过的,不知道怎么被删除了。下面是上次回答的代码。

import random
cnt_n = int(input("题目数量:"))
max_n = int(input("最大数字:"))

# 产生乘法查找表
times_list = []
for i in range(max_n):
    for j in range(max_n):
        if i * j <= max_n:
            qst = str(i) + "*" + str(j)
            rst = str(i*j)
            if qst not in times_list:
                times_list.append([qst, rst])

# 题目表
question_list = []
for _ in range(cnt_n):
    # 随机运算,0+,1-,2*,3/
    op = random.randint(0, 3)

    # +
    if op == 0:
        x1 = random.randint(0, max_n)
        x2 = random.randint(0, max_n - x1)
        result = x1 + x2
        qst = str(x1) + "+" + str(x2) + "="
        question_list.append([qst, result])

    # -
    elif op == 1:
        x1 = random.randint(0, max_n)
        x2 = random.randint(0, x1)
        result = x1 - x2
        qst = str(x1) + "-" + str(x2) + "="
        question_list.append([qst, result])

    # *
    elif op == 2:
        tmp = random.sample(times_list, 1)
        qst = tmp[0][0] + "="
        question_list.append([qst, tmp[0][1]])

    # /
    elif op == 3:
        tmp = random.sample(times_list, 1)
        x1, x2 = tmp[0][0].split("*")
        result = tmp[0][1]
        while int(x1) == 0:
            tmp = random.sample(times_list, 1)
            x1, x2 = tmp[0][0].split("*")
            result = tmp[0][1]
        qst = result + "/" + x1 + "="
        question_list.append([qst, x2])

print("开始回答:")
wrong = ""
for i, qst in enumerate(question_list):
    x = input("第:>2d题:".format(i+1, qst[0]))
    if int(x) != int(qst[1]):
        wrong += str(i+1) + "  "

w_item = wrong.split()
print("回答正确道题目。".format(len(question_list) - len(w_item)))
print("回答错误的题号是:".format(wrong))

参考技术A 第一步,考虑加减乘除四种运算符的优先级,乘除优先,所以首先你进行运算的时候要考虑先生成乘除运算,然后才是加减运算。
第二部,就是依次迭代构造运算架构和运算数,格外需要关注除法运算,每一次检查除法的除数是否为0,可以每一步构造的时候生成中间结果,然后你构造完成的时候就直接给出结果。其他的细节你可以自己想想。

如何用 numpy 计算统计“t-test”

【中文标题】如何用 numpy 计算统计“t-test”【英文标题】:How to calculate the statistics "t-test" with numpy 【发布时间】:2011-01-20 10:24:02 【问题描述】:

我希望生成一些关于我在 python 中创建的模型的统计信息。我想对其进行 t 检验,但想知道是否有一种简单的方法可以使用 numpy/scipy 来做到这一点。周围有什么好的解释吗?

例如,我有三个相关的数据集,如下所示:

[55.0, 55.0, 47.0, 47.0, 55.0, 55.0, 55.0, 63.0]

现在,我想对它们进行学生 t 检验。

【问题讨论】:

【参考方案1】:

在scipy.stats 包中,ttest_... 函数很少。参见here的示例:

>>> print 't-statistic = %6.3f pvalue = %6.4f' %  stats.ttest_1samp(x, m)
t-statistic =  0.391 pvalue = 0.6955

【讨论】:

感谢您的回复。它似乎需要一个随机变量。我必须事先从我的样本总体中生成一个随机变量吗? 我认为您可以只使用您的样本(而不是“样本总体”) 作为一个样本值的样本?我的印象是我可以使用几个结果的样本作为参数,但也许我被误导了:) 在统计学中,样本是总体的子集(请参阅en.wikipedia.org/wiki/Sample_%28statistics%29)。所以我的意思很简单,没有术语“样本总体”:) 一个值只是样本中的一个值(这是一组值)。【参考方案2】:

van 使用 scipy 的回答完全正确,使用scipy.stats.ttest_* 函数非常方便。

但是我来到这个页面是为了寻找一个纯 numpy 的解决方案,如标题中所述,以避免对 scipy 的依赖。为此,让我指出这里给出的例子:https://docs.scipy.org/doc/numpy/reference/generated/numpy.random.standard_t.html

主要问题是,numpy 没有累积分布函数,因此我的结论是你真的应该使用 scipy。无论如何,只使用 numpy 是可能的:

从最初的问题我猜你想比较你的数据集并用 t 检验判断是否存在显着偏差?此外,样本是配对的吗? (见https://en.wikipedia.org/wiki/Student%27s_t-test#Unpaired_and_paired_two-sample_t-tests) 在这种情况下,您可以像这样计算 t 值和 p 值:

import numpy as np
sample1 = np.array([55.0, 55.0, 47.0, 47.0, 55.0, 55.0, 55.0, 63.0])
sample2 = np.array([54.0, 56.0, 48.0, 46.0, 56.0, 56.0, 55.0, 62.0])
# paired sample -> the difference has mean 0
difference = sample1 - sample2
# the t-value is easily computed with numpy
t = (np.mean(difference))/(difference.std(ddof=1)/np.sqrt(len(difference)))
# unfortunately, numpy does not have a build in CDF
# here is a ridiculous work-around integrating by sampling
s = np.random.standard_t(len(difference), size=100000)
p = np.sum(s<t) / float(len(s))
# using a two-sided test
print("There is a  % probability that the paired samples stem from distributions with the same means.".format(2 * min(p, 1 - p) * 100))

这将打印出There is a 73.028 % probability that the paired samples stem from distributions with the same means.,因为这远远高于任何合理的置信区间(比如 5%),因此您不应该针对具体案例得出任何结论。

【讨论】:

【参考方案3】:

一旦获得 t 值,您可能想知道如何将其解释为概率——我做到了。这是我写的一个函数来帮助解决这个问题。

它基于我从 http://www.vassarstats.net/rsig.html 和 http://en.wikipedia.org/wiki/Student%27s_t_distribution 收集到的信息。

# Given (possibly random) variables, X and Y, and a correlation direction,
# returns:
#  (r, p),
# where r is the Pearson correlation coefficient, and p is the probability
# of getting the observed values if there is actually no correlation in the given
# direction.
#
# direction:
#  if positive, p is the probability of getting the observed result when there is no
#     positive correlation in the normally distributed full populations sampled by X
#     and Y
#  if negative, p is the probability of getting the observed result, when there is no
#     negative correlation
#  if 0, p is the probability of getting your result, if your hypothesis is true that
#    there is no correlation in either direction
def probabilityOfResult(X, Y, direction=0):
    x = len(X)
    if x != len(Y):
        raise ValueError("variables not same len: " + str(x) + ", and " + \
                         str(len(Y)))
    if x < 6:
        raise ValueError("must have at least 6 samples, but have " + str(x))
    (corr, prb_2_tail) = stats.pearsonr(X, Y)

    if not direction:
        return (corr, prb_2_tail)

    prb_1_tail = prb_2_tail / 2
    if corr * direction > 0:
        return (corr, prb_1_tail)

    return (corr, 1 - prb_1_tail)

【讨论】:

我只是想指出,相关系数没有任何解释为概率,所以这很混乱。它只是在区间 [-1,1] 中取值的线性相关性度量 相关系数显然与概率相关(看这个函数的返回值):docs.scipy.org/doc/scipy/reference/generated/… 系数越强,两件事真正相关的可能性就越大。如果您对整个宇宙进行抽样,您可以将相关性视为事实,但如果您的样本量有限,则它只是相关性的一个指标:概率。 相关系数衡量一个值在已知另一个值的情况下可以预测的程度:它是一个变量解释另一个变量的方差比例。仅仅因为它取 0 到 1 之间的值(或其绝对值)并不意味着它是一个概率。因此,正如您所建议的那样,它不会在限制中采用二进制值:对于无限样本大小,它仍然采用区间 [-1,1] 中的任何值。它的值表示关系的强度,无论样本大小如何,这种关系都可能很弱。 我并不是说相关系数是一个概率。这个问题的主题是相关系数(t检验)的统计显着性。我提供了三个参考资料。这是给你的第四个参考,它简短而清晰。我希望您有时间阅读本文并了解相关系数和概率之间的关系,然后再回到这里并再次给我的答案打分:sahs.utmb.edu/pellinore/intro_to_research/wad/correlat.htm 好的,我看到了问题:你的函数返回的 p 不是“没有相关性的概率”。在解释假设检验时,这是一个常见的错误。它是在给定样本中观察到 rho=r 的概率,给定总体中的 rho=0(零假设)。请参阅en.wikipedia.org/wiki/P-value#Misunderstandings 以获得全面的细分:“p 值不是原假设为真的概率,也不是备择假设为假的概率。事实上,频率统计没有也不能附加概率假设”

以上是关于如何用Python生成计算题?的主要内容,如果未能解决你的问题,请参考以下文章

如何用 Python 计算 CRC32 以匹配在线结果?

python20181225——面试题

c#生成的Json如何用python解析

如何用python实现行列互换?

2 如何用Python进行数据计算

如何用Excel计算P值?