随机浮点数学方程?

时间:2011-11-21 22:48:14

标签: ios math floating-point arc4random

我有这个方法:

- (float)randomFloatBetween:(float)num1 andLargerFloat:(float)num2 {
return ((float)arc4random() / ARC4RANDOM_MAX) * num2-num1 + num1;
}

我很好奇,如果有可能而不是使用以下条件: 我想为我的游戏做一个随机浮动:

When the score is:
Score 0-20: I want a float between 4.0-4.5 using the above method
Score 21-40: I want a float between 3.0-3.5 using the above method
Score 41-60: I want a float between 2.5-3.0 using the above method
Score 61+: I want a float between 2.0-2.5 using the above method

现在我知道我可以使用条件来做到这一点,但有没有比这样做更容易的数学公式?

谢谢!

EDIT1:

    - (float)determineFloat {
    if (score <= 60)
    {
        //Gets the tens place digit, asserting >= 0.
        int f = fmax(floor( (score - 1) / 10 ), 0);

        switch (f)
        {
            case 0:
            case 1:
            {
                // return float between 4.0 and 4.5
                [self randomFloatBetween:4.0 andLargerFloat:4.5];
            }
            case 2:
            case 3:
            {
                // return float between 3.0 and 3.5
                [self randomFloatBetween:3 andLargerFloat:3.5];
            }
            case 4:
            case 5:
            {
                // return float between 2.5 and 3.0
                [self randomFloatBetween:2.5 andLargerFloat:3];
            }
            default:
            {
                return 0;
            }
        }
    }
    else
    {
        // return float between 2.0 and 2.5
        [self randomFloatBetween:2.0 andLargerFloat:2.5];
    }
    return;
}
这是怎么回事?你还确定这是最有效的方法吗?

1 个答案:

答案 0 :(得分:2)

可能不是,因为这种关系不是连续的。当你有这种要求时,最好只使用条件或switch语句。您和任何阅读或调试代码的人都会确切地知道函数正在做什么。在这种情况下使用某种数学函数,最好是非常复杂,最有可能减慢这个过程。

使用开关的可能性:

-(float)determineFloat:(float)score
{
    if (score <= 60)
    {
        //Gets the tens place digit, asserting >= 0.
        int f = (int)fmax(floor( (score - 1) / 10.0f ), 0);

        switch (f)
        {
            case 0:
            case 1:
            {
                return [self randomFloatBetween:4.0 andLargerFloat:4.5];
            }
            case 2:
            case 3:
            {
                return [self randomFloatBetween:3.0 andLargerFloat:3.5];
            }
            case 4:
            case 5:
            {
                return [self randomFloatBetween:2.5 andLargerFloat:3.0];
            }
            default:
            {
                return 0;
            }
        }
    }
    else
    {
        return [self randomFloatBetween:2.0 andLargerFloat:2.5];
    }
}

用法:

float myScore = 33;
float randomFloat = [self determineFloat:myScore];

现在,randomFloat将是介于3和3.5之间的值。