Математическое уравнение для случайного числа? - PullRequest
1 голос
/ 22 ноября 2011

У меня есть этот метод:

- (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 Ответ

2 голосов
/ 22 ноября 2011

Вероятно, нет, так как отношение не является непрерывным. Когда у вас есть такое требование, лучше просто использовать условные выражения или оператор 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.

...