Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 代码是正确的,但有时会出现运行时错误_Swift_Random_Numbers_Cycle - Fatal编程技术网

Swift 代码是正确的,但有时会出现运行时错误

Swift 代码是正确的,但有时会出现运行时错误,swift,random,numbers,cycle,Swift,Random,Numbers,Cycle,我写了一个函数,在这个函数里面有一个开关,在任何情况下都有随机生成的数字操作 我在for循环中多次调用此函数,并将结果复制到数组中,有时在执行过程中出现EXC_BAD_指令错误,我不明白为什么 我注意到,如果周期更长,错误会更频繁地出现,为什么? 我要做什么才能在更大的周期内不出错地使用这段代码 var operationNumber = random() % 4 switch operationNumber { case 0: number1 = random() % (bigg

我写了一个函数,在这个函数里面有一个开关,在任何情况下都有随机生成的数字操作 我在for循环中多次调用此函数,并将结果复制到数组中,有时在执行过程中出现EXC_BAD_指令错误,我不明白为什么

我注意到,如果周期更长,错误会更频繁地出现,为什么? 我要做什么才能在更大的周期内不出错地使用这段代码

var operationNumber = random() % 4  

switch operationNumber {
case 0:
    number1 = random() % (biggestN + 1)
    number2 = random() % (biggestN + 1)
    result = number1 + number2
    operation = "+"
case 1:
    number1 = random() % (biggestN + 1)
    number2 = random() % (number1 + 1)
    result = number1 - number2
    operation = "-"
case 2:
    number1 = (random() % (biggestN + 1))+1
    number2 = (random() % (number1/2))+1
    result = number1 * number2
    operation = "x"
case 3:
    result = random()%biggestN
    number1 = (random()%biggestN)*result
    number2 = number1 / result
    operation = "/"
default:
    break
}
在编辑器中,出现错误的行是案例0的行,因此我认为错误在开关内部


感谢您的回答

在案例3中,您可能会得到零除错误。在这种情况下,您应该断言
结果
不是零。一种方法是:

result = (random() % biggestN) + 1
编辑:

如果
biggestN
为零,也会发生同样的情况。因此,我们可以更新到:

result = (random() % (biggestN + 1)) + 1
已解决:

case 0:
    number1 = random() % (biggestN + 1)
    number2 = random() % (biggestN + 1)
    result = number1 + number2
    operation = "+"
case 1:
    number1 = random() % (biggestN + 1)
    number2 = random() % (number1 + 1)
    result = number1 - number2
    operation = "-"
case 2:
    number1 = (random() % (biggestN + 1))+1
    number2 = (random() % (biggestN + 1))
    result = number1 * number2

    operation = "x"
case 3:
    result = (random()%biggestN)+1
    number1 = (random()%biggestN)*result
    number2 = number1 / result
    operation = "/"

Junior很接近,本质上问题是/和%的分母(左操作数)必须为非零,并且有多个情况不满足该条件。最简单的修复方法是使用
arc4random\u uniform
替换
random
,这也将为您提供更好的分发:

func pick(range:Int) -> Int {
    return Int(arc4random_uniform(UInt32(range)))
}

func sampler(biggestN:Int) {
    var operationNumber = pick(4)
    var result:Int = 0
    var number1:Int = 0
    var number2:Int = 0
    var operation:String = "X"

    switch operationNumber {
    case 0:
        number1 = pick(biggestN + 1)
        number2 = pick(biggestN + 1)
        result = number1 + number2
        operation = "+"
    case 1:
        number1 = pick(biggestN + 1)
        number2 = pick(number1 + 1)
        result = number1 - number2
        operation = "-"
    case 2:
        number1 = pick(biggestN + 1) + 1
        number2 = pick(number1 / 2) + 1
        result = number1 * number2
        operation = "x"
    case 3:
        result = pick(biggestN) + 1
        number1 = pick(biggestN) * result
        number2 = number1 / result
        operation = "/"
    default:
        break
    }
}

“代码是正确的,但有时我会遇到运行时错误”这是一种创新的说法“代码是错误的”:-)如果你能找出错误发生的那一行,这会有所帮助。错误发生在案例0中,但我当时试图做一个长周期排除案例,我认为问题出在案例2中,但我不知道为什么:结果=(随机()%(最大值+1))+1?