将浮点随机舍入为整数

2024-05-18 07:52:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我想要一个函数(如果相关的话,可以使用Python 3.6+),它将以以下方式将浮点数随机舍入为整数:

给定一个实数,x,leta = floor(x)和letb = ceil(x)。然后,编写一个函数s_int(),该函数将以b - x的概率返回a,并以x - a的概率返回b

例如,s_int(14.8)应在20%的时间内返回14,在剩余的80%时间内返回15


以下是我的尝试:

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})

以下是我的问题:

    >p>是否有任何边缘情况我认为这个函数不起作用?

  1. 还有其他更简单或更优雅的解决方案吗

  2. 可以让它跑得更快吗


Tags: 函数inimportforcounter时间情况range
1条回答
网友
1楼 · 发布于 2024-05-18 07:52:37
  1. 我认为没有边缘案例
  2. 尝试使用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]))
  1. 我认为这是一个O(1)操作。不会走得更快

相关问题 更多 >