python中生成剔除部分数字的随机整数

python中生成剔除部分数字的随机整数

要实现的功能

最开始是想简单地实现返回在区间[low, high)之间的随机整数,只是有一个值我不想他出现而已。如果这样的话,代码真的很简单。

def gen_randint(low, high, discard):
	result_list = list(range(low, high))
	result_list.remove(discard)
	np.random.shuffle(result_list)
	
	return result_list.pop()

但在做的过程中,想到可能会出现下面这几种情况。

  1. 需要剔除的不是一个单值,而是一串数字
  2. 可能需要返回一个随机数组
  3. 可能只传了上界或者下界,那么这时候就要考虑到如何设置生成区间的问题

代码实现

# @Time    :2020/12/12 11:40
# @Author  :korolTung
# @FileName: user_function.py
import numpy as np

def randomint_plus(low, high=None, cutoff=None, size=None):
    """用来生成不包含一些中间数值的随机整数或序列

    Parameters
    ----------
    low : int
        生成随机整数的下界
    high: int
        生成随机整数的上界
    cutoff: int/list
        不需要包含的一个或多个值
    size: tuple
        需要产生的随机数规模
    Notes
    -----
    1. 在调用过程中,如果high, cutoff, size都缺省,就默认返回一个[0, low)的值
    2. 如果cutoff, size缺省,返回[low, high)的一个随机整数值
    3. 如果size缺省, 则返回一个[low, cutoff)U(cutoff, high)的随机整数值
    4. 返回一个给定size的矩阵,矩阵元素为[low, cutoff)U(cutoff, high)的随机整数值

    See Also
    --------
    np.random.randint()

    """
    if high is None:
        assert low is not None, "必须给定一个值作为上界"
        high = low
        low = 0
    number = 1  # 将size拉长成为一个向量
    if size is not None:
        for i in range(len(size)):
            number = number * size[i]

    if cutoff is None:  # 如果不需要剔除值,就通过numpy提供的函数生成随机整数
        random_result = np.random.randint(low, high, size=size)
    else:
        if number == 1:  # 返回一个随机整数
            random_result = randint_digit(low, high, cutoff)
        else:  # 返回一个形状为size的随机整数数组
            random_result = np.zeros(number, )
            for i in range(number):
                random_result[i] = randint_digit(low, high, cutoff)
            random_result = random_result.reshape(size)

    return random_result.astype(int)


def randint_digit(low, high, cutoff):
    """用来生成一个在区间[low, high)排除cutoff后的随机整数

    Parameters
    ----------
    low: int
        下限,能够取到
    high: int
        上限,不能够取到
    cutoff: int/list
        一个需要剔除的数或者数组,要求在(low, high)区间之间
    """
    digit_list = list(range(low, high))
    if type(cutoff) is int:  # 只需要剔除一个值
        if cutoff in digit_list:  # 如果需要剔除的值不存在,则不执行剔除操作
            digit_list.remove(cutoff)
    else:
        for i in cutoff:  # 需要剔除多个值的情况
            if i not in digit_list:  # 如果需要剔除的值不存在,则不执行剔除操作
                continue
            digit_list.remove(i)

    np.random.shuffle(digit_list)

    return digit_list.pop()  # 生成的序列打乱并且返回当前的随机值

if __name__ == '__main__':
    cutoff1 = 3
    cutoff2 = [3, 5, 10]
    low = 1
    high = 9
    result = randint_digit(low, high, cutoff2)

思路

思路很简单,但是要考虑到每种传入参数的可能,还是下了点功夫。总的来说就是我太菜了。好在有所收获。

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值