首页 文章

生成巨大的随机数时出现malloc错误

提问于
浏览
3

我想得到一个从0到大数(2 ^ 31)的随机元素 .

我尝试从这样的 Range 创建一个 Array (所以我可以使用Swift的 Array.randomElement ),就像here一样:

let myArray: [Int64] = [Int64](0...4294967292)

哪个编译,但崩溃:

MyPoject(1569,0x100cc2f40)malloc:无法分配区域mach_vm_map(size = 34359738368)失败(错误代码= 3)MyProject(1569,0x100cc2f40)malloc:在malloc_error_break中设置断点以进行调试

当然,我可以写一个custom function来创建数组,但这有点气味,特别是因为数组每次都是完全相同的 .

Swift能提供更好的解决方案吗?

2 回答

  • 5

    错误消息

    malloc:无法分配区域mach_vm_map(size = 34359738368)

    告诉你运行时无法分配32GB的内存 - 这就是4294967292 64位整数的数组所需要的

    let myArray: [Int64] = [Int64](0...4294967292)
    

    但是没有必要为此目的创建一个数组 . 从Swift 4.2开始,您可以直接致电

    let rnd = Int64.random(in: 0...4294967292)
    // or
    let rnd = Int64.random(in: 0..<4294967293)
    

    使用其中之一

    static func random(in range: ClosedRange<Self>) -> Self
    static func random(in range: Range<Self>) -> Self
    

    FixedWidthInteger协议的方法 .

    最后请注意 4294967292 不是 2^31 = 2147483648 - 如果打算在 0 (包括)到 2^31 (不包括)的范围内创建一个随机数,那么

    let rnd = Int32.random(in: 0...Int32.max)
    

    会诀窍 .

  • 3

    ClosedRange 在Swift 4.2中也有一个 randomElement 方法:

    print((0...4294967292).randomElement()!)
    

    请注意,您说您想要一个0到2 ^ 31之间的随机数,但在您的示例中使用了 1...4294967292 而不是 0...4294967292 .

相关问题