gpt4 book ai didi

来自两个不重叠范围的 Python 随机唯一值

转载 作者:太空狗 更新时间:2023-10-30 02:29:53 34 4
gpt4 key购买 nike

正如标题所说的,来自两个范围的 100 个随机唯一值,或者更准确地说,有一个范围和一个从有效值中排除的子范围。

示例范围从 0 到 10000,随机 100 个不在 10 到 20 范围内的数字

要求:

  • 子范围可以在最开始或最后。
  • 内存开销降至绝对最低。
  • 尽可能接近 random.shuffle() 的随机化。

我知道 random.sample(xrange(0,10000),100) 给出 100 个唯一值。

设置我会存储三个值 [start,end,total]

  1. start = 子范围的开始
  2. end = 子范围结束
  3. 总计 = 范围的长度

我能想到的最好的:

randlist=[]
while len(randlist)<100:
temp=random.randint(0,total)
if temp < start or temp > end:
if temp not in randlist:
randlist.append(temp)

这是真正的随机(伪随机)还是我以任何方式影响它?

最佳答案

randlist = [r + (end - start + 1) * (r >= start) for r in
random.sample(range(total - end + start), 100)]

例子/“证明”:

  • 总计=10,开始=2,结束=5
  • 有 7 个允许的数字:0、1、6、7、8、9、10
  • range(total-end+start) = range(7) 从 7 个数字 0..6 中挑选(到目前为止还不错)
  • 大于等于start=2的数向上移动end-start+1=4
  • 结果数字为 0、1、6、7、8、9、10。

演示:

>>> sorted(randlist2(2000000000, 10000000, 1900000000))
[176827, 3235435, 3278133, 3673989, 5148447, 8314140, 8885997, 1900189345, 1902880599,
...
1997494057, 1997538971, 1997854443, 1997907285]

这一直有效到超过 20 亿,轻松超过 “维基百科英文维基百科页面的数量,所以无论是多少百万” :-) 的要求上限。之后它得到 OverflowError: Python int too large to convert to C ssize_t。我没有看到我的 PC 内存使用量出现峰值,结果是即时的。显然,这是使用 Python 3。

关于来自两个不重叠范围的 Python 随机唯一值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30251185/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com