Понимание случайных чисел в iOS Swift 2

Как мне сделать так, чтобы случайное число продолжало изменяться со временем в программе (то есть становиться новым в пределах диапазона каждый раз, когда я хочу его использовать)?

Я в тупике. Я прочитал более 20 различных сообщений и статей о том, как генерировать случайные числа на этом языке (в котором я новичок), и я просто не могу заставить его работать.

Я в основном пытаюсь получить случайный двойной от 1.0-3.0. Я могу сделать это довольно легко, но как только он выбрал этот номер, он не изменится. Это мой код, который я использую:

var randomNumber:Double = (Double(arc4random() % 3) + 1);

Затем я использую это как значение для строки:

SKAction.waitForDuration(randomNumber)

Каждый раз, когда я запускаю это, я хочу снова изменить номер, но как только программа запускается, она продолжает тот же номер (он меняется каждый раз, когда я сбрасываю программу)

Я понимаю, как сгенерировать номер, но не могу ничего найти по его обновлению!

я пытался добавить

randomNumber = (Double(arc4random() % 3) + 1);

в код в том месте, где он будет запускаться много раз, но все равно дает мне то же самое.

Я очень хорошо знаком с С++, поэтому, если вы пытаетесь что-то объяснить, вы можете сослаться на его стиль, и я, скорее всего, пойму.


person MarshallD    schedule 20.01.2016    source источник
comment
помните, что randomNumber — это переменная, а не указатель на функцию, поэтому, когда вы говорите SKAction.waitForDuration(randomNumber), вы на самом деле каждый раз говорите var randomNumber = 3; SKAction.waitForDuration(3). Вам нужно сначала создать новое случайное число, затем создать новый waifForDuration с этим новым случайным числом и добавить это новое действие в спрайт.   -  person Knight0fDragon    schedule 20.01.2016


Ответы (3)


Использовать:

SKAction.waitForDuration(sec: NSTimeInterval, withRange: NSTimeInterval) 

где sec — это середина диапазона времени, которое вы хотите использовать, поскольку диапазон идет в +- направлении.

Итак, в вашем случае вы хотите:

SKAction.waitForDuration(2, withRange: 2),  this will get you a range of 1 to 3 (-1 to 1 range)

Если по какой-то причине вам нужен метод, который будет постоянно создавать новое случайное ожидание, вы всегда можете сделать:

extension SKAction
{
    func waitForRandomDuration() -> SKAction
    {
        var randomNumber:Double = (Double(arc4random() % 3) + 1);
        return SKAction.waitForDuration(randomNumber);

    }
}

И затем убедитесь, что вы добавляете это как новое действие в свой спрайт каждый раз, когда вам нужно это сделать, если вы сохраните его в переменной, ваша случайность не изменится.

person Knight0fDragon    schedule 20.01.2016
comment
Это выглядит великолепно, но как мне внедрить его в последовательность SKAction? Когда я делаю SKAction.waitForRandomDuration(), я получаю сообщение об ошибке: Отсутствует аргумент для параметра № 1 в вызове. Какие параметры мне нужно будет ввести? - person MarshallD; 20.01.2016
comment
Я обновил свой ответ на то, что вы хотите делать, я почти забыл о предложении withRange. Я не знаю, почему вы получаете сообщение об ошибке отсутствующего аргумента, хотя при использовании моего метода - person Knight0fDragon; 20.01.2016
comment
Теперь с этим обновлением я получаю сообщение об ошибке "Extraneous argument label 'sec:' in call" Поэтому я попытался исключить это, и это сработало! Спасибо!! - person MarshallD; 20.01.2016
comment
Ага, забыл убрать первое название параметра, оно не нужно - person Knight0fDragon; 20.01.2016
comment
Это не целое число, подождите, я надеюсь, что все в порядке - person Knight0fDragon; 20.01.2016
comment
Да, это нормально, хотя другие люди могут захотеть увидеть это, если они используют это как ссылку - person MarshallD; 20.01.2016
comment
вам нужно будет использовать метод расширения, но это немного сложнее сделать в вашем сценарии, вам в значительной степени нужно сделать настраиваемое действие, которое не завершится до запрошенной продолжительности ожидания. - person Knight0fDragon; 20.01.2016

Что вам нужно, так это вычисляемое свойство только для чтения, которое будет возвращать новое случайное значение каждый раз, когда вы пытаетесь получить к нему доступ:

var randomNumber: Double {
    return Double(arc4random_uniform(3).successor())
}

print(randomNumber)  // 2.0
print(randomNumber)  // 2.0
print(randomNumber)  // 1.0
print(randomNumber)  // 3.0
print(randomNumber)  // 3.0
person Leo Dabus    schedule 20.01.2016
comment
Спасибо!!! Это имеет гораздо больше смысла, единственная проблема в том, что я думаю, что тогда у меня может быть более конкретная проблема. Я использую runAction(SKAction.repeatActionForever( SKAction.sequence([ SKAction.runBlock(addMonster), SKAction.waitForDuration(randomNumber) ]), но когда я использую ваш код, я все равно получаю тот же номер. Любые идеи? - person MarshallD; 20.01.2016
comment
единственная проблема в том, что мой метод тоже не будет работать, так как возвращаемое действие будет статическим в том виде, в котором он его использует. - person Knight0fDragon; 20.01.2016

Попробуйте этот код:

func randomNumberBetween1_0And3_0() -> Double {
    return 1 + Double(arc4random_uniform(2000)) / 1000.0
}

for index in 1...10 {
    print(randomNumberBetween1_0And3_0())
}

Пример вывода: 2,087 1,367 1,867 1,32 2,402 1,803 1,325 1,703 2,069 2,335

person Arun Ammannaya    schedule 20.01.2016