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

Dan*_*ger 3 largenumber int64 random-seed swift

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

我试图创建一个Array由这样的Range(这样我就可以使用SWIFT的 Array.randomElement),如做在这里:

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

哪个编译,但崩溃:

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

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

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

Mar*_*n R 5

错误消息

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

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

let myArray: [Int64] = [Int64](0...4294967292)
Run Code Online (Sandbox Code Playgroud)

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

let rnd = Int64.random(in: 0...4294967292)
// or
let rnd = Int64.random(in: 0..<4294967293)
Run Code Online (Sandbox Code Playgroud)

使用其中之一

static func random(in range: ClosedRange<Self>) -> Self
static func random(in range: Range<Self>) -> Self
Run Code Online (Sandbox Code Playgroud)

FixedWidthInteger协议的方法.

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

let rnd = Int32.random(in: 0...Int32.max)
Run Code Online (Sandbox Code Playgroud)

会诀窍.