• 有意思的问题


    把遇到的有意思的问题写出来,尤其是跟数学相关的问题,目的是自我监督,尽量把代码写规范些、用的方法更好一些,否则自己写又会草草了事了。。。

    目录:

    1、随机数 top20均值 随机抽取20组 问题

    2、可乐瓶盖收集一定能中奖 问题

    ——————————————————————————————————————

    1、今天15级的群里面有个学弟提的问题:

    有100个数,服从正态分布。取其中最大的20个数,求出平均值为n;如果这100个数随机不放回抽取,每5个数为一组,取最大值,直到取完100个数,得到的20个最大值,求出平均值为m。那么,n和m是什么关系?

    这个问题暂时想不清,做一个实验:

    #-*- coding:utf-8 -*-
    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    
    class ARandomQuetion(object):
        """docstring for ARandomQuetion"""
        def Discovery(self):
            randomnumber = np.random.randn(100)
            #注意sorted是拷贝一份排序好的序列,原序列不变,而sort就是就地修改
            srandomnumber = sorted(randomnumber)
            meanoftop20 = np.mean(srandomnumber[-20:])
            
            #返回一个随机排列,然后每隔5个数取作一组
            permutation = np.random.permutation(100)
            seq = range(0,100,5)
            pick20 = [max(randomnumber[i:i+5]) for i in seq]
            meanofpick20 = np.mean(pick20)
    
            return meanoftop20,meanofpick20
    
    ARQ = ARandomQuetion()
    top20 = []
    pick20 = []
    #作100次实验
    for i in xrange(100):
        before,after = ARQ.Discovery()
        top20.append(before)
        pick20.append(after)
    
    fig,axes = plt.subplots(1,1)
    axes.plot(top20,label = 'mean of top20')
    axes.plot(pick20,label = 'mean of pick20')
    axes.legend(loc = 'best')
    plt.show()

    然而,结果并不明显。。。

    image

    --

    今天又想了想这个问题,可以推广一下:

    top20求平均的情况下,第二种就是将100个数随机分为20组,分别取最大再求平均;top10求平均的情况下,第二种就是将100个数随机分为10组,分别取最大再求平均,等等。

    那么现在问题就转换为,m与n的大小关系(或者多次试验m与n的期望之间的大小关系)和分的组数之间的关系。

    --

    今天做了一下组数和m与n差之间的关系:

    #-*- coding:utf-8 -*-
    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    
    class ARandomQuetion(object):
        """docstring for ARandomQuetion"""
        def Discovery(self,n,num):
            randomnumber = np.random.rand(n)
            #注意sorted是拷贝一份排序好的序列,原序列不变,而sort就是就地修改
            srandomnumber = sorted(randomnumber)
            meanoftop = np.mean(srandomnumber[-num:])
            
            #返回一个随机排列,然后每隔N/num个数取作一组
            permutation = np.random.permutation(n)
            gap = int(n/num)
            seq = range(0,n,gap)
            pick = [max(randomnumber[i:i+gap]) for i in seq]
            meanofpick = np.mean(pick)
            return meanoftop,meanofpick
    
    ARQ = ARandomQuetion()
    #作100次实验
    diffrence = []
    N = 100
    ele = [x for x in range(1,int(np.sqrt(N))) if N % x == 0]
    ele2 = [int(N/x) for x in ele]
    ele.extend(ele2)
    ele.sort()
    M = 100
    for num in ele:
        result = [ARQ.Discovery(N,num) for i in xrange(M)]
        top = zip(*result)[0]
        pick = zip(*result)[1]
        diffrence.append(np.mean(np.array(top) - np.array(pick)))
    print ele[np.argmax(diffrence)]
    fig,axes = plt.subplots(1,1)
    axes.plot(ele,diffrence)
    axes.plot(ele,diffrence,'o')
    axes.set_xlabel('number of groups')
    axes.set_ylabel('diff of m-n')  
    plt.show()

    考虑到整数,只能分为[1,2,4,5,10,20,25,50,100]组。最后发现在分为50组的时候差最大。

    image

    只不过,理论上面还是没推出来暂时。

    --

    --2016.2.23--

    2、下面也是个好玩的问题,上半年一个同学发给我的。

    某次买可乐集瓶盖活动中有5中不同的瓶盖以等概率出现,每买一瓶可乐可以得到一个瓶盖,那么,想集齐所有瓶盖需要买几瓶可乐?

    这个问题是一个负多项分布问题。负多项分布由负二项分布推广而来。负二项分布:

    实验包含一系列独立的实验, 每个实验都有成功、失败两种结果,成功的概率是恒定的,实验持续到第r次成功。

    其密度函数为:

  • 相关阅读:
    L2-004. 这是二叉搜索树吗?*
    L2-001. 紧急救援(最短路的变形)*
    L2-002. 链表去重(数组模拟)
    L1-028. 判断素数
    Linux相关
    2016ICPC-大连 A Simple Math Problem (数学)
    2016ICPC-大连 Convex (几何)
    2016ICPC-大连 To begin or not to begin (简单思维)
    TC704div2 C ModEquationEasy 矩阵快速幂+dp
    poj 3150 Cellular Automaton 矩阵快速幂
  • 原文地址:https://www.cnblogs.com/batteryhp/p/5202573.html
Copyright © 2020-2023  润新知