簡體   English   中英

選擇隨機整數,除了 python 的特定數字?

[英]Choosing random integers except for a particular number for python?

我只是想知道如何讓 python 生成除特定數字之外的隨機數? 例如,我希望它生成除 3 之外的 1 到 5 之間的任何數字,因此 output 將為1, 2, 4, 53將不計入列表中。 我能做些什么來實現這一目標?

一個例子是這樣的:
一場游戲中有五個電腦玩家(玩家 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM