user14974779
user14974779

Reputation:

Trying to randomly generate numbers that divide evenly

I was trying to solve this problem but no luck, I have a function that is responsible for the logic but to be honest I don't think that that is the problem, I think that the issue is in the way that the variables are being read. If anyone can help it would be a great deal. What is happening when I run the code is it seems like just random numbers are generated without any logic. What I am expecting is for the randomly generated numbers to be equally divided to not have a remainder.

Function:

struct MathContentView: View {
    
    @ObservedObject var viewModel = VariableViewModel()
    
    @State var parent: MathView
    
    // realistic numbers ... only for subtraction and division
    
    // realistic numbers ... only for subtraction and division
    
    func numbersGenerator() {
        viewModel.numTemp1 = Int.random(in: 0...difficultyNumber1)
        viewModel.numTemp2 = Int.random(in: 0...difficultyNumber2)
        
        if viewModel.numTemp1 > viewModel.numTemp2 && operatorName == "Subtraction" {
            viewModel.num1 = viewModel.numTemp1
            viewModel.num2 = viewModel.numTemp2
        }
        if viewModel.numTemp2 > viewModel.numTemp1 && operatorName == "Subtraction" {
            viewModel.num1 = viewModel.numTemp2
            viewModel.num2 = viewModel.numTemp1
        }
        if viewModel.numTemp1 == viewModel.numTemp2 && operatorName == "Subtraction" {
            viewModel.num1 = viewModel.numTemp1
            viewModel.num2 = viewModel.numTemp2
        }
        if operatorName == "Division" {
            
            // applied zeros (/)
            if viewModel.zeroToggle == false {
            if viewModel.numTemp2 != 0 {
                if viewModel.numTemp1 % viewModel.numTemp2 == 0 {
                    viewModel.num1 = viewModel.numTemp1
                    viewModel.num2 = viewModel.numTemp2
                }
                else {
                    numbersGenerator()
                }
            }
            else {
                numbersGenerator()
            }
                viewModel.result = viewModel.num1 / viewModel.num2
            }
        // no zeros (/)
            if viewModel.zeroToggle == true {
            if viewModel.numTemp1 != 0 && viewModel.numTemp2 != 0 {
                if viewModel.numTemp1 % viewModel.numTemp2 == 0 {
                    viewModel.num1 = viewModel.numTemp1
                    viewModel.num2 = viewModel.numTemp2
                }
                else {
                    numbersGenerator()
                }
            }
            else {
                numbersGenerator()
            }
        }
        
        if operatorName == "Multiplicaton" {
            viewModel.num1 = Int.random(in: 0...difficultyNumber1)
            viewModel.num2 = Int.random(in: 0...difficultyNumber2)
        }
        }
    }
    
    func passButton() {
        numbersGenerator()
        viewModel.num1 = Int.random(in: 0...difficultyNumber1)
        viewModel.num2 = Int.random(in: 0...difficultyNumber1)
    }

ViewModel is a file where the variables are coming from, here is the code for that:

    // temp value
    var numTemp1 = 0
    var numTemp2 = 0

    // Randomizing numbers for easy Multiplication
@Published var num1 = Int.random(in: 0...5)
@Published var num2 = Int.random(in: 0...5)

Upvotes: 0

Views: 105

Answers (2)

Floyd Watson
Floyd Watson

Reputation: 408

A quick solution could be to check if the generated number is divisible by 2 using the Modulo operator %

if it is not add 1

@Published var generatedNum  = Int.random(in: 0...5)
@Published var num1 = generatedNum % 2 == 0 ? generatedNum : generatedNum++

I dont use Swift so do not know if that is the correct syntax. But have seen that both Modulo and Ternary Operators exist

Upvotes: 1

Ali Samji
Ali Samji

Reputation: 479

It seems like you are trying to generate a random multiple of some number (X). If that's the case, it would be easier to just multiply the random number by X. Assuming X is 5 . . .

viewModel.numTemp1 = 5 * Int.random(in: 0...difficultyNumber1)

If you want to enforce a maximum on the generated multiple, you can just use integer division to find the max to use for the random generator.

randMax = Int(difficultyNumber1 / 5)
viewModel.numTemp1 = 5 * Int.random(in: 0...randMax)

Upvotes: 1

Related Questions