ошибка malloc при генерации огромного случайного числа - PullRequest
0 голосов
/ 09 декабря 2018

Я хочу получить случайный элемент от 0 до огромного числа (2 ^ 31).

Я пытался создать Array из такого Range (поэтому я могу использовать Swift's Array.randomElement), как сделано здесь :

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

, который компилируется, но завершается с:

MyPoject (1569,0x100cc2f40) malloc: невозможно выделить область пользовательская функция для создания массива, но это пахнет, тем более что массив будет каждый раз точно таким же.

Предоставляет ли Swift лучшее решение?

Ответы [ 2 ]

0 голосов
/ 09 декабря 2018

ClosedRange также имеет метод randomElement в Swift 4.2:

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

Обратите внимание, что вы сказали, что хотите случайное число от 0 до 2 ^ 31, но вы использовали 1...4294967292 вместо0...4294967292 в вашем примере.

0 голосов
/ 09 декабря 2018

Сообщение об ошибке

malloc: невозможно выделить область mach_vm_map (size = 34359738368)

говорит о том, что во время выполнения не удалось выделить 32 ГБ памяти - вот чтодля массива из 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)

будеттрюк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...