[英]Choosing random integers except for a particular number for python?
我只是想知道如何讓 python 生成除特定數字之外的隨機數? 例如,我希望它生成除 3 之外的 1 到 5 之間的任何數字,因此 output 將為1, 2, 4, 5
和3
將不計入列表中。 我能做些什么來實現這一目標?
一個例子是這樣的:
一場游戲中有五個電腦玩家(玩家 0 到 4)。
玩家 1 隨機選擇其他玩家(除了自己),玩家 2 到 4 也會做同樣的事情。
所以 output 將類似於:
Player 1, who do you want to play with?
Player 1 chooses Player 2
在列表上使用random.choice
,但首先從列表中刪除該特定數字:
>>> import random
>>> n = 3
>>> end = 5
>>> r = range(1,n) + range(n+1, end)
>>> r
[1, 2, 4]
>>> random.choice(r)
2
>>> random.choice(r)
4
或者定義一個函數:
def func(n, end, start = 1):
return range(start, n) + range(n+1, end)
...
>>> r = func(3, 5)
>>> r
[1, 2, 4]
>>> random.choice(r)
2
更新:
這將返回列表中除特定數字以外的所有數字:
>>> r = range(5)
for player in r:
others = range(0, player) + range(player+1, 5)
print player,'-->', others
...
0 --> [1, 2, 3, 4]
1 --> [0, 2, 3, 4]
2 --> [0, 1, 3, 4]
3 --> [0, 1, 2, 4]
4 --> [0, 1, 2, 3]
聽起來好像你想產生一組隨機的數字,然后從這些數字中一個一個地挑選。 換句話說,沒有重復的隨機序列。
生成所有這些數字,隨機播放,然后使用.pop()
一次選擇一個並將其從一組可能性中刪除:
import random
numbers = range(5) # list(range(5)) in Python 3
random.shuffle(numbers)
a_random_number = numbers.pop()
another_random_number = numbers.pop()
list.pop()
從隨機打亂的數字列表中刪除最后一個值。
甚至只是洗牌然后循環遍歷列表可能就足夠了:
players = range(5)
random.shuffle(players)
for player in players:
# random ordering of players
您可以將隨機數序列產生式捆綁為函數中的迭代器:
import random
def random_number_sequence(n):
numbers = range(n) # list(range(n)) in Python 3
random.shuffle(numbers)
return iter(numbers)
random_sequence = random_number_sequence(5)
a_random_number = next(numbers)
another_random_number = next(numbers)
您可以在迭代器上調用next()
,它將從序列中生成另一個隨機數,直到序列耗盡(此時返回StopIteration
)。
在這種情況下, random.choice
將工作正常,但您也可以使用一個明顯的簡單數學變換。 如果玩家編號為 0 到 5,並且您是玩家 X,則:
number = random.choice(0, 4) # first, pick a number: 0, 1, 2, 3, or 4
if number >= X: # then, if it's me or higher...
number += 1 # move forward one player
請注意,無論您是哪個玩家編號,這都有效。 如果您是#5,這將選擇一個介於 0 和 4 之間的數字,這不是您(因為您是#5)。 如果您是 #0,這將選擇 0 到 4 之間的一個數字,即 >= you(因為您是#0)所以您加 1 給出一個介於 1 和 5 之間的數字。如果您是 #3,這將選擇一個介於兩者之間的數字0 和 4,如果是 3 或 4,則分別將其提高 1 到 4 或 5。
編輯添加:這將不允許您進行“公平”交替(每個人都可以在有人再次去之前輪流)。 如果需要,生成一個列表,使用random.shuffle
將其按隨機順序排列,然后從列表中選擇(使用.pop()
或類似方法)直到它為空。 然后,您可以為新的(但不同的)“公平”訂單重新填充和重新排列列表。
(請注意,這種事情就是為什么在“如何到達那里”之前弄清楚你想要什么很重要。)
而其他答案是正確的。
另一種方法是從大小為 n-1 的數字范圍中隨機選擇。 然后對 >= 您要跳過的數字的任何結果進行 +1。
import numpy as np
def random_choice_except(a, size, excluding, replace=False):
choices = np.random.choice(a-1, size, replace=replace)
return choices + (choices >= excluding)
這個想法是。 從 LIST(A) 中選取隨機數 每次從 LIST(A) 中選取隨機數時,LIST(A) 都會變小。 所以你不能重復。 如果 Python pics '2' 第一次。 它不能第二次這樣做,因為 '2' 不在 LIST(A) ...
import random
random_numbers = [1,2,3,4,5]
X = []
while True:
one = random.choice(random_numbers))
# print(one)
if str(one) not in X:
X.append(str(one))
break
if '2' in X:
print("Last number was 2 with out repeating!")
print("You did it u pick random numbers one by one with out repeating")
random_numbers.remove(one)
print(X)
我建議使用遞歸 function。
import random
def randint_exc(start, end, exception):
res = random.randint(start, end)
if res != exception:
return res
else:
return randint_exc(start, end, exception)
test = randint_exc(1, 4, 1)
print(test)
# results will be 2 or 3 or 4
對於可變數量的異常,您可以使用*args
參數。
def randint_exc(start, end, *exception):
res = random.randint(start, end)
if res not in exception:
return res
else:
return randint_exc(start, end, *exception)
test1 = randint_exc(1, 4, 1)
print(test1)
# results will be 2 or 3 or 4
test2 = randint_exc(1, 4, 1, 2)
print(test2)
# results will be 3 or 4
或者您可以使用list
來更容易閱讀。
def randint_exc(start, end, exception_list):
res = random.randint(start, end)
if res not in exception_list:
return res
else:
return randint_exc(start, end, exception_list)
test1 = randint_exc(1, 4, [1])
print(test1)
# results will be 2 or 3 or 4
test2 = randint_exc(1, 4, [1, 2])
print(test2)
# results will be 3 or 4
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.