繁体   English   中英

为什么 Ruby 的 Array#count 对于大型数组不可靠?

[英]Why is Ruby's Array#count unreliable for large arrays?

我正在迭代一个相当大数组的 2 个元素的组合。 在计算组合的元素时,我发现了一些奇怪的东西。 以下示例显示了我的意思:

[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-combinationhttps://ruby-doc.org/core-2.2.0/Array.html#method -i-计数

非常感谢。

Array#count不是有问题的方法, Enumerator#count是:

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

好消息是你遇到的错误在几个月前被报告为#14805并随后修复,但坏消息是从那时起没有发布新版本的 CRuby。 所以要么等待 2.5.2、2.4.5 等,要么自己编译一个带有修复程序的版本。

问题是枚举器的计数器仅限于有符号的 32 位整数,因此发生了溢出:

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

通过将计数器设置为 bignum(Ruby 的任意精度整数类型,因为 2.4 是内部实现细节)来修复它,以防其值超出int范围或目前为unsigned long

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM