环境

Ubuntu 16.04

Python 3.5.2

问题

现有一个生成1-5随机数的函数random_5(概率平均),如何将此转换为生成1-7随机数random_7的函数(概率平均),不得使用random模块

思路一(False)

直接将random_5生成的随机数乘以7/5后再通过round函数进行四舍五入后输出

random_5输出 random_7输出
1 1
2 3
3 4
4 6
5 7

特别糟糕的想法…

思路二(False)

生成两次random_5,将两者的值相加后减一(random_5 + random_5 - 1),得出随机数1-9,而后再做一次判断,将8和9剔除掉,只在返回1-7的时候输出

不过很快就发现,只有在两次random_5都返回1的时候,才会返回1,概率远小于返回其它六个数

又是一个糟糕的想法…

思路三(True)


* 通过之前的两种思路,可以总结出将random_5返回的数据经过各种处理后不筛选返回1-7是不可能实现的(不能说不可能,只是我个人能力有限,暂时还没想出方法),那必须采用思路二中的筛选方法。
* 确定要使用筛选方法之后,目标就变成了生成等概率的、值取值范围大于1-7的随机数。
* 相加和返回值乘系数的方法都尝试过了,那么是否可以将两者结合一下呢。
* 首先思考乘系数,random_5 * 2 - 1的返回结果是[1, 3, 5, 7, 9],想要等概率生成1-10的话,比如再将此返回值加上随机生成的0和1,也就是random.randint(0,阅读全文 “将生成1-5随机数函数转换为1-7随机数函数的实现方法及其进阶”

0 环境:

Ubuntu 16.04

1 准备工作

2 安装并配置虚拟环境(本机)

2.1 更新软件源

sudo apt-get update
sudo apt-get upgrade
  • update是更新软件列表
  • upgrade是对比本地软件版本和线上最新软件版本,然后升级

2.2 安装虚拟环境

sudo pip2 install virtualenv
  • virtualenv是虚拟环境安装包,创建虚拟环境可以更好地控制包的版本,包的版本不会因为2.1中的升级操作而升级,保证了项目的稳定性
  • 不同虚拟环境之间的运行环境相互独立,互不干扰
sudo pip2 install virtualenvwrapper
  • virtualenvwrappervirtualenv的扩展管理包,可以将所有的虚拟环境整合在一个目录下
  • 使用前需要先进行以下配置
  1. 创建虚拟环境管理目录
mkdir ~/.virtualenvs
阅读全文 “从零开始在 Ubuntu 下部署 Nginx__uWSGI__Django 服务器”

环境

Python 3.5.2

原理

  • 找出列表中最大和最小的元素
  • 构建新列表,元素全为零,长度为最大值与最小值之间的差值加一
  • 统计待排序列表中每个值i出现的次数,并将新列表中下标为i-min的值加一
  • 将新列表中非零值的下标反转回原有元素i(即加上最小值),构建有序列表

源码

def count_sort(l):
    max = 0
    min = 1024

    for item in l:
        if item > max:
            max = item
        elif item < min:
            min = item

    count = [0]*(max-min+1)
    for index in l:
        count[index-min] += 1

    index = 0
    for i in range(max-min+1):
        for j in range(count[i]):
            l[index] = i+min
            index += 1

if __name__ == '__main__':
    l = [6, 5, 2, 8, 9, 4, 1, 0, 3, 7]
    print(l)
    count_sort(l)
    print(l)

时间复杂度

  • 最优时间复杂度:O(n+k)
  • 最坏时间复杂度:O(n+k)
  • 稳定性(多个元素等值的情况下是否会破坏原有顺序):稳定