代码之家  ›  专栏  ›  技术社区  ›  knugie

为什么Ruby的数组在大型数组中不可靠?

  •  2
  • knugie  · 技术社区  · 7 年前

    我在迭代一个相当大的数组的两个元素的组合。当计算组合的元素时,我发现了一些奇怪的东西。下面的例子说明了我的意思:

    [1] pry(main)> 10000.times.to_a.combination(2).count
    => 49995000   # correct
    
    [2] pry(main)> 100000.times.to_a.combination(2).count
    => 704982704  # wrong, should be 4999950000
    
    [3] pry(main)> count = 0; 100000.times.to_a.combination(2).each { count+=1 }; count
    => 4999950000 # correct
    

    我用Wolframalpha再次检查了结果:

    我的问题是,为什么 Array#count 在这种情况下不可靠吗?

    此外,参见 https://ruby-doc.org/core-2.2.0/Array.html#method-i-combination https://ruby-doc.org/core-2.2.0/Array.html#method-i-count .

    谢谢。

    1 回复  |  直到 7 年前
        1
  •  8
  •   cremno    7 年前

    Array#count 不是马车的方法, Enumerator#count 是:

    100000.times.to_a.combination(2).class # => Enumerator
    

    好消息是,几个月前你遇到的错误被报告为 #14805 后来又修好了,但坏消息是从此没有新版本的克鲁比被发布。因此,要么等待2.5.2、2.4.5等,要么自己用修复程序编译一个版本。

    问题是枚举器的计数器被限制为带符号的32位整数,因此发生溢出:

    max = (1 << 31) - 1 # max value
    4999950000 & max    # => 704982704
    

    如果计数器的值超出了 int 或者现在 unsigned long .

    推荐文章