Умножение на случайный # и печать результата

#ios #swift #random #swiftui

#iOS #swift #Случайный #swiftui

Вопрос:

По сути, то, что я пытаюсь сделать, это создать случайное число в диапазоне от 0,001 до 0,999, взять это число и умножить на сублоттоны (в настоящее время просто установлено значение 1000,0) и добавить это число к одному другому числу (все равно нужно добавить этот бит кода) для конечного результата.

Проблема, которую я замечаю при вызове чисел для отображения на экране, заключается в том, что мое случайное число покажет одно, но математика не работает.

Например, на моем экране в настоящее время указано, что мое случайное число равно .943. 1000 * .943 должно равняться 943 для моего случайного образца тоннажа, вместо этого он сообщает мне, что оно равно 525.

Может ли быть так, что мой код дважды вызывает переменную randomNumber?

Спасибо за помощь!

 var randomNumber: Double {
    let ranNum = Double.random(in: 0.001..<1)
    return ranNum
}

let sublotTons = 1000.0

var randomTons: Double {
    sublotTons * randomNumber
}

var body: some View {
    // Display Random Number
    VStack {
        Text("Random Number: (randomNumber, specifier: "%.3f")")
        Text("Sublot Tons = 1000")
        Text("Random Sample Tonnage: (randomTons, specifier: "%.0f")")
    }
}
 

}

Комментарии:

1. Не связано с вашим вопросом, но если вы намерены исключить ноль из результатов, вы можете использовать FloatingPoint свойство nextUp . И, кстати, Swift — это язык, основанный на выводе типа. Вы можете опустить Double префикс. var randomNumber: Double { .random(in: 0.nextUp ..< 1) }

Ответ №1:

Да, randomNumber вызывается дважды.
Поскольку randomNumber это вычисляемое свойство, при каждом вызове randomTons оно будет возвращать новое случайное значение.
Итак, если вы намерены использовать то же значение, я предлагаю сохранить randomNumber и создать randomTons функцию, которая получает это сохраненное значение:

     var randomNumber: Double {
        let ranNum = Double.random(in: 0.001..<1)
        return ranNum
    }

    let sublotTons = 1000.0

    func randomTons(_ number: Double) -> Double {
        sublotTons * number
    }

    var body: some View {
        // Display Random Number
        VStack {
            let storedRandomNumber = randomNumber
            Text("Random Number: (storedRandomNumber, specifier: "%.3f")")
            Text("Sublot Tons = 1000")
            Text("Random Sample Tonnage: (randomTons(storedRandomNumber), specifier: "%.0f")")
        }
    }
 

Ответ №2:

Вы вызываете его дважды: один раз здесь:

 Text("Random Number: (randomNumber, specifier: "%.3f")")
 

и затем, при вычислении случайных чисел здесь:

 Text("Random Sample Tonnage: (randomTons, specifier: "%.0f")")
 

Комментарии:

1. Да, и, возможно, стоит упомянуть, что оба randomNumber и randomTons являются так называемыми вычисляемыми свойствами, и прикрепленный к ним код выполняется при каждом обращении к ним. Лично я бы пропустил первое свойство и переместил этот код во второе.

Ответ №3:

Вы можете использовать что-то вроде этого

 var randomNumber: Double = {
    let ranNum = Double.random(in: 0.001..<1)
    return ranNum
}()
 

для того, чтобы randomNumber вычислялся и сохранялся один раз при запуске и использовался позже в нужных вам местах. У вас уже есть это значение, не нужно создавать еще одну переменную, чтобы сохранить ее снова.