Mathegleichung für einen zufälligen Float?

  • Ich habe diese Methode:

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

    Und ich bin gespannt, ob es so ist ist möglich, anstelle von Bedingungen für Folgendes zu verwenden: Ich möchte ein zufälliges Float wie folgt erstellen:

     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
     
    < Jetzt weiß ich, dass ich Konditionale verwenden kann, aber gibt es irgendeine mathematische Gleichung, die einfacher wäre als das?

    Danke!

    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;
    }
     

    Wie? Sind Sie sicher, dass dies der effizienteste Weg ist, dies zu tun?

    10 May 2012
    mskfisherDavid Saltares
1 answer
  • Wahrscheinlich nicht, da die Beziehung nicht stetig ist. Wenn Sie diese Art von Anforderung haben, ist es besser, nur Bedingungswerte oder eine switch-Anweisung zu verwenden. Sie und alle, die den Code lesen oder debuggen, wissen dann genau, was die Funktion tut. Die Verwendung einer mathematischen Funktion, die im besten Fall äußerst kompliziert wäre, wird den Prozess wahrscheinlich verlangsamen.

    Möglichkeit der Verwendung eines Schalters:

     -(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];
        }
    }
     

    Verwendung:

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

    Nun ist randomFloat ein Wert zwischen 3 und 3,5.

    22 November 2011
    Evan Mulawski