我想在Python
中生成1或-1,作爲在非負數和非正數之間隨機化或隨機更改已存在整數的符號的步驟。在Python
中生成1或-1的最佳方法是什麼?假設均勻分佈的,我知道我可以使用:隨機生成1或-1(正整數或負整數)
import random
#method1
my_number = random.choice((-1, 1))
#method2
my_number = (-1)**random.randrange(2)
#method3
# if I understand correctly random.random() should never return exactly 1
# so I use "<", not "<="
if random.random() < 0.5:
my_number = 1
else:
my_number = -1
#method4
my_number = random.randint(0,1)*2-1
使用timeit
模塊,我得到了以下結果:
#method1
s = "my_number = random.choice((-1, 1))"
timeit.timeit(stmt = s, setup = "import random")
>2.814896769857569
#method2
s = "my_number = (-1)**random.randrange(2)"
timeit.timeit(stmt = s, setup = "import random")
>3.521280517518562
#method3
s = """
if random.random() < 0.5: my_number = 1
else: my_number = -1"""
timeit.timeit(stmt = s, setup = "import random")
>0.25321546903273884
#method4
s = "random.randint(0,1)*2-1"
timeit.timeit(stmt = s, setup = "import random")
>4.526625442240402
如此出人意料方法3是最快的。我打賭方法1是最快的,因爲它也是最短的。另外方法1(因爲Python 3.6
我認爲?)和3給出了引入不均勻分佈的可能性。雖然方法1是最短的(主要advantege)現在我會選擇方法3:在Python
s = """
import random
def positive_or_negative():
if random.random() < 0.5:
return 1
else:
return -1
"""
timeit.timeit(stmt = "my_number = positive_or_negative()", setup = s)
>0.3916183138621818
沒有更好的(更快或更短)方法隨機生成-1或1:
def positive_or_negative():
if random.random() < 0.5:
return 1
else:
return -1
測試?任何原因爲什麼你會選擇方法1而不是方法3,反之亦然?
方法3是最快的,因爲所有其他方法都必須在內部執行類似的操作。 – Barmar