python中生成剔除部分數字的隨機整數

2021-10-11 21:44:47 字數 3092 閱讀 8654

最開始是想簡單地實現返回在區間[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(

)

但在做的過程中,想到可能會出現下面這幾種情況。

需要剔除的不是乙個單值,而是一串數字

可能需要返回乙個隨機數組

可能只傳了上界或者下界,那麼這時候就要考慮到如何設定生成區間的問題

# @time    :2020/12/12 11:40

# @author :koroltung

# @filename: user_function.py

import numpy as np

defrandomint_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

notnone

,"必須給定乙個值作為上界"

high = low

low =

0 number =

1# 將size拉長成為乙個向量

if size is

notnone

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

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

isint

:# 只需要剔除乙個值

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)

思路很簡單,但是要考慮到每種傳入引數的可能,還是下了點功夫。總的來說就是我太菜了。好在有所收穫。

python中生成器

生成器 生成器generator 生成器函式generator m i for i in range 5 定義乙個生成器 print type m 判斷m的型別,是乙個生成器 print next m 使用next函式 def inc 定義乙個inc函式 for i in range 5 yield...

python中生成器yield

def yield demo for x in range 3 yield x print 生成器後一行 a yield demo print a 這裡的a是乙個生成器物件 可以用for迴圈來遍歷生成器物件裡的元素 for i in a print i 那麼yield的工作過程是怎麼樣的呢?可以通過...

Python中生成ndarray例項講解

生成ndarray最簡單的方法就是array函式,array函式接受任意的序列型物件,生成乙個新的包含傳遞資料的numpy陣列。例子如下 import numpy as np data1 1,2,3,4 data2 1,2,3,4 5,6,7,8 arr1 np.array data1 arr2 n...