python - 将浮点数随机四舍五入为整数
问题描述
我想要一个函数(如果相关,使用 Python 3.6+),它将以下列方式将浮点数随机四舍五入为整数:
给定一个实数,x
,让a = floor(x)
和 让b = ceil(x)
。然后,编写一个函数,该函数s_int()
将以a
的概率返回并以 的概率b - x
返回。b
x - a
例如,s_int(14.8)
应该返回14
20% 的时间,并15
在剩余的 80% 的时间内返回。
这是我的尝试:
import math
from random import random
def s_int(x):
a = math.floor(x)
return a + ((x - a) > random())
它似乎适用于我能想到的所有情况:
In [2]: Counter(s_int(14.7) for _ in range(1000000))
Out[2]: Counter({14: 300510, 15: 699490})
In [3]: Counter(s_int(-14.7) for _ in range(1000000))
Out[3]: Counter({-15: 700133, -14: 299867})
In [4]: Counter(s_int(14) for _ in range(1000000))
Out[4]: Counter({14: 1000000})
In [5]: Counter(s_int(-14) for _ in range(1000000))
Out[5]: Counter({-14: 1000000})
In [6]: Counter(s_int(0) for _ in range(1000000))
Out[6]: Counter({0: 1000000})
以下是我的问题:
有没有我认为这个功能不起作用的边缘情况?
还有其他更简单或更优雅的解决方案吗?
可以让它运行得更快吗?
解决方案
- 我认为没有边缘情况
- 尝试使用 numpy
import numpy as np
def s_int(x):
a = np.floor(x)
b = a + 1
return (np.random.choice([a, b], p=[b - x, x - a]))
- 我认为这是一个 O(1) 操作。不会走得更快。
推荐阅读
- python - pynput 无法识别小键盘上的键
- bash - 根据最后一个字符串对行进行排序并删除除一行之外的所有行?
- robotframework - 将只有 `__new__` 的 Python 类导入机器人框架
- c# - 从下拉列表中填充
- html - Visual Studio 2017 不断重新格式化我的代码,这让我抓狂
- java - Spark 查找连续的时间范围
- reactjs - FormSpy-订阅脏的onChange未在输入字段中显示值
- python - 如何从一个类中显示连续计算的函数值?
- php - php 不回显 POST 数据
- spring - Spring:方法不允许返回错误代码 403(禁止)而不是 405