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

新手上路,请多包涵

我想在 Python 中生成 1 或 -1 作为在非负数和非正数之间随机化或随机更改已存在整数符号的步骤。在 Python 中生成 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 是最短的(主要优势),但我现在会选择方法 3:

 def positive_or_negative():
    if random.random() < 0.5:
        return 1
    else:
        return -1

测试:

 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

Python 中随机生成 -1 或 1 的任何更好(更快或更短)的方法?为什么你会选择方法 1 而不是方法 3,反之亦然?

原文由 Siemkowski 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.6k
2 个回答

数学变得简单:

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

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

 print(random.randint(0,1)*2-1)

没有 randint 也可以工作

print(int(random.random()*2)*2-1)

原文由 Kerkael Belarpaillon 发布,翻译遵循 CC BY-SA 4.0 许可协议

#3 的单行变体:

 return 1 if random.random() < 0.5 else -1

它比“数学”变体更快,因为它不涉及额外的算术。

原文由 Has QUIT–Anony-Mousse 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题