随机生成1或-1(正或负整数)

Sie*_*ski 5 python random

我想生成1或-1 Python作为在非负数和非正数之间随机化或随机更改已经存在的整数的符号的步骤。生成1或-1 in的最佳方法是Python什么?假设分布均匀,我知道我可以使用:

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
Run Code Online (Sandbox Code Playgroud)

使用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
Run Code Online (Sandbox Code Playgroud)

因此,出人意料的是方法3是最快的。我押注方法1最快,因为它也最短。方法1(因为Python 3.6我认为是?)和方法3都可以引入不均匀分布。尽管目前方法1最短(主要优点),但我还是选择方法3:

def positive_or_negative():
    if random.random() < 0.5:
        return 1
    else:
        return -1
Run Code Online (Sandbox Code Playgroud)

测试:

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
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法(更快或更短)随机生成-​​1或1 in Python?为什么选择方法1而不是方法3或反之亦然?

pjs*_*pjs 7

这是另一个单行代码,我的时间显示比 if/else 与 0.5 的比较要快:

[-1,1][random.randrange(2)]
Run Code Online (Sandbox Code Playgroud)


小智 6

不确定您的应用程序到底是什么,但我需要类似的大型矢量化数组。

这是获取符号数组的好方法:

(2*np.random.randint(0,2,size=(your_size))-1)

结果是一个数组,例如:

数组([-1, -1, -1, 1, 1, 1, -1, -1, 1, 1, 1, -1, -1, 1, -1])

并且您可以使用 reshape 命令将上述内容设置为矩阵的大小:

(2*np.random.randint(0,2,size=(m*n))-1).reshape(m,n)

然后你可以用上面的矩阵乘以得到所有具有随机符号的成员。

A= np.array([[1, 2, 3], [4, 5, 6]])

B = A*(2*np.random.randint(0,2,size=(2*3))-1).reshape(2,3)

然后你会得到类似的东西:

B = 数组([[ 1, 2, -3],[ 4, 5, -6]])

很快,如果您的数据是矢量化的。


Ker*_*lon 6

数学变得简单:

  1. 生成随机数:0或1
  2. 将它们乘以 2:0 或 2
  3. 减去 1:-1 或 1

使其适应任何编程代码。无需测试功能。

print(random.randint(0,1)*2-1)
Run Code Online (Sandbox Code Playgroud)

没有 randint 也可以工作

print(int(random.random()*2)*2-1)
Run Code Online (Sandbox Code Playgroud)


Ano*_*sse 5

#3的一种班轮变化:

return 1 if random.random() < 0.5 else -1
Run Code Online (Sandbox Code Playgroud)

它比'math'变体快,因为它不涉及其他算术。