RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 890621
Accepted
Clarence
Clarence
Asked:2020-10-09 00:38:31 +0000 UTC2020-10-09 00:38:31 +0000 UTC 2020-10-09 00:38:31 +0000 UTC

数组中的随机数不等于 0

  • 772

有一定的整数数组,比如[5, 0, 2, 4, 0, 0, 2, 9] 需要从这个数组中选择一个随机数,但不等于0。使用​​它random检查0直到有一个合适的数字在时间上是不合理的,理论上你几乎可以搜索无限期地。另一种选择是遍历此数组并创建一个新数组,丢弃所有零,然后random从新数组中进行选择。这也很昂贵并且需要额外的内存。还有其他类似的搜索选项吗?

python
  • 3 3 个回答
  • 10 Views

3 个回答

  • Voted
  1. Best Answer
    AnT stands with Russia
    2020-10-09T00:59:49Z2020-10-09T00:59:49Z

    如果数组中零的数量很大,即 使用“试错法”是不合适的,那么问题可以很容易地在一次遍历数组的情况下解决,而不需要额外的内存,即 无需创建任何新数组或修改现有数组。

    我们只是从头到尾遍历我们的数组,忽略零元素,计数非零元素,每次遇到一个非零元素,我们以概率“取”它1 / K,这里K是遇到的非零元素的个数到目前为止`。当整个数组被扫描后,最后一个“采取”的元素就是我们等可能选择的元素。

    这是一个油藏案例的经典“油藏采样”。只有在您的情况下,您才需要忽略空值。

    例如,在 C 中它可能看起来像这样

    #include <stdlib.h>
    #include <stdio.h>
    
    int main(void)
    {
      const unsigned a[] = { 5, 0, 2, 4, 0, 0, 2, 9 };
      unsigned n = sizeof a / sizeof *a;
    
      unsigned take, nz = 0;
      for (unsigned i = 0; i < n; ++i)
        if (a[i] > 0 && rand() % ++nz == 0)
          take = a[i];
    
      printf("%u\n", take);
    }
    

    当然,如果您需要对相同的输入数据多次执行这样的选择,那么简单地“过滤”一次原始数组仍然有意义,从其中排除零。

    • 3
  2. MBo
    2020-10-09T00:44:00Z2020-10-09T00:44:00Z

    您可以就地压缩数组

    zcount = 0
    for i in range(len(A)):
         if A[i] == 0:
             zcount +=1
         else:
             A[i - zcount] = A[i]
    

    如有必要,将最后一个元素的 zcount 设置为零

    • 1
  3. Lecron
    2020-10-09T00:59:54Z2020-10-09T00:59:54Z

    如果在额头上,我们找到了元素,而 0 我们继续前进到下一个。

    import random
    
    lst = [5, 0, 2, 4, 0, 0, 2, 9]
    idx = random.randrange(0, len(lst))
    while not lst[idx]:
        idx += 1
        if idx > len(lst):
            idx = 0
    print(idx, lst[idx])
    

    如果是声明性的

    from itertools import chain
    
    lst = [5, 0, 2, 4, 0, 0, 2, 9]
    idx = random.randrange(0, len(lst))
    print(next(filter(bool, chain(lst[idx:], lst))))
    
    • 0

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    是否可以在 C++ 中继承类 <---> 结构?

    • 2 个回答
  • Marko Smith

    这种神经网络架构适合文本分类吗?

    • 1 个回答
  • Marko Smith

    为什么分配的工作方式不同?

    • 3 个回答
  • Marko Smith

    控制台中的光标坐标

    • 1 个回答
  • Marko Smith

    如何在 C++ 中删除类的实例?

    • 4 个回答
  • Marko Smith

    点是否属于线段的问题

    • 2 个回答
  • Marko Smith

    json结构错误

    • 1 个回答
  • Marko Smith

    ServiceWorker 中的“获取”事件

    • 1 个回答
  • Marko Smith

    c ++控制台应用程序exe文件[重复]

    • 1 个回答
  • Marko Smith

    按多列从sql表中选择

    • 1 个回答
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Suvitruf - Andrei Apanasik 什么是空? 2020-08-21 01:48:09 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5