【问题标题】:Generating n random numbers between i and j python在 i 和 j python 之间生成 n 个随机数
【发布时间】:2018-07-18 01:01:56
【问题描述】:

我想使用 i 和 j 之间的 n 个数字创建一个随机数。例如,对于 n=10 和 i=1 和 j=5,预期这样的输出:2414243211。我使用以下代码在 R 中做到了:

paste(floor(runif(10,1,5)),collapse="") #runif create 10 random number between 1 and 5 and floor make them as integer and finally paste makes them as a sequence of numbers instead of array. 

我想在 Python 中做同样的事情。我找到了random.uniform,但它会生成 1 个数字,我不想使用循环。

import random
import math
math.floor(random.uniform(1,5)) #just generate 1 number between 1 and 5

更新

  • i 和 j 是 0 到 9 之间的整数,而 n 可以是任何整数。
  • i 和 j 决定字符串中可以使用的数字,而 n 表示数字字符串的长度。

【问题讨论】:

  • 在原生 Python 中,你必须使用循环——如果你熟悉 R——那么你可能想看看 numpy/pandas。
  • 所以你想要一个带有这些数字的号码? int(''.join([str(math.floor(random.uniform(1,5))) for _ in range(10)]))

标签: python r random


【解决方案1】:

如果你认为列表理解是循环(实际上在很多方面都是循环),你不会对此感到满意,但我会试试运气:

from random import randint

res = ''.join([str(randint(1, 5)) for _ in range(10)])
print(res)  #-> 4353344154

注意事项:

  1. 结果是一个字符串!如果需要整数,请转换为 int
  2. randint 工作包容性start (1) 和 end (5) 可能会被生成并返回。如果您不想这样做,请修改它们(start = 2end = 4
  3. 您使用random.uniform(以及随后使用math.floor())而不是简单地使用randint,有什么原因吗?

【讨论】:

  • 因为我想创建数千个不同长度的数字,我更喜欢为此目的使用循环而不是生成随机数。那么没有循环就没有办法生成超过1个数字吗?对于 3,不,我根本不知道 randint。非常感谢
  • @Hadij 有。只需将现有的列表理解包装在另一个列表中。 res = [''.join([str(randint(1, 5)) for _ in range(10)]) for _ in range(5)]
【解决方案2】:

如果我理解你的问题(我不确定),并且你有 Python 3.6,你可以使用random.choices

>>> from random import choices
>>> int(''.join(map(str, choices(range(1, 5), k=10))))
2121233233

【讨论】:

    【解决方案3】:
    x = ''.join([str(math.floor(random.uniform(1,5)))  for i in range(10)])
    

    【讨论】:

      【解决方案4】:

      random.choices() 函数可以满足您的需求:

      >>> from random import choices
      >>> n, i, j = 10, 1, 5
      >>> population = list(map(str, range(i, j+1)))
      >>> ''.join(choices(population, k=n))
      '5143113531'
      

      【讨论】:

      • 我会选择:''.join(map(str, choices(range(i, j+1), k=n))) - 无需将范围设为列表,只需让它从范围中采样,然后进行映射。可能值得注意的是choices 是 3.6+ - 仍然有很多人在 3.5...
      • 这几乎就是我所做的@JonClements 但是雷蒙德有理由在选择采样之前进行字符串转换吗?
      • 考虑range(1, 1000000000) 可能是候选池而k=10 是所有需要的情况......至少你将只有10个元素的列表,而不是临时的一个范围...
      • 很难从措辞的问题中判断哪个是最好的。我的看法是 ij 是数字范围,因此它们的数量会是十个或更少。与此同时,看起来 n 可能会变大。
      • @RaymondHettinger 是的,你是对的。 i 和 j 在 [0,9] 范围内,n 可以是任何整数。谢谢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-19
      • 1970-01-01
      • 2013-05-06
      • 2023-03-03
      • 1970-01-01
      • 2013-01-02
      相关资源
      最近更新 更多