web-dev-qa-db-fra.com

Comment créer un float aléatoire dans Objective-C?

J'essaie de créer un float aléatoire compris entre 0,15 et 0,3 en Objective-C. Le code suivant renvoie toujours 1:

int randn = (random() % 15)+15;
float pscale = (float)randn / 100;

Qu'est-ce que je fais mal?

32
Roman

Essaye ça: 

 (float)Rand() / Rand_MAX

Ou pour en avoir un entre 0 et 5:

 float randomNum = ((float)Rand() / Rand_MAX) * 5;

Plusieurs façons de faire la même chose.

20
Caladain

Voici une fonction

- (float)randomFloatBetween:(float)smallNumber and:(float)bigNumber {
float diff = bigNumber - smallNumber;
return (((float) (arc4random() % ((unsigned)Rand_MAX + 1)) / Rand_MAX) * diff) + smallNumber;
}
63
Boris
  1. utilisez arc4random () ou indiquez vos valeurs aléatoires
  2. essayer

    float pscale = ((float)randn) / 100.0f;
    
4
Lou Franco

Votre code fonctionne pour moi, il produit un nombre aléatoire compris entre 0,15 et 0,3 (à condition que je sème srandom()). Avez-vous appelé srandom() avant le premier appel à random()? Vous devrez fournir à srandom() une valeur entropique (beaucoup de gens n'utilisent que srandom(time(NULL))).

Pour une génération de nombres aléatoires plus sérieuse, jetez un œil à arc4random , qui est utilisé à des fins cryptographiques. Cette fonction de nombre aléatoire renvoie également un type entier, vous aurez donc toujours besoin de convertir le résultat en un type à virgule flottante.

3
dreamlax

Plus facile.

+ (float)randomNumberBetween:(float)min maxNumber:(float)max
{
    return min + arc4random_uniform(max - min + 1);
}
2
jose920405

Pour ajouter à la réponse de @ Caladain, si vous voulez que la solution soit aussi facile à utiliser que Rand(), vous pouvez définir ces options:

#define randf() ((CGFloat)Rand() / Rand_MAX)
#define randf_scaled(scale) (((CGFloat)Rand() / Rand_MAX) * scale)

N'hésitez pas à remplacer CGFloat par double si vous n'avez pas accès à CoreGraphics.

0
Ben Leggiero

Utiliser srandom () et Rand () n'est pas sûr lorsque vous avez besoin d'une vraie randomisation avec du sel float.

Sur MAC_10_7, IPHONE_4_3 et versions supérieures, vous pouvez utiliser arc4random_uniform (upper_bound) * . Cela permet de générer un entier entier aléatoire réel de 0 à * upper_bound *.

Donc, vous pouvez essayer ce qui suit

u_int32_t upper_bound = <some big enough integer>;

float r = 0.3 * (0.5 + arc4random_uniform(upper_bound)*1.0/upper_bound/2);
0
malex