[英]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-combination和https://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.