2011-05-31 22 views
8

Hacer esto:Float Arc4random?

float x = arc4random() % 100; 

devuelve un resultado decente en un número entre 0 y 100.

Pero hacer esto:

float x = (arc4random() % 100)/100; 

devuelve 0. ¿Cómo puedo conseguir que vuelva una valor flotante?

+2

Use 'arc4random_uniform (int)' en lugar de una construcción de módulo. Consulte la página man ('arc4random (3)') por qué. –

+0

arc4random_uniform se agregó en 4.3. También usaría esto en lugar de mi respuesta a continuación si puede. – bensnider

+0

La primera línea devuelve un int entre 0 y 99. –

Respuesta

24

Simplemente, está haciendo división de enteros, en lugar de división de punto flotante, por lo que acaba de obtener un resultado truncado (.123 se trunca a 0, por ejemplo). Pruebe

float x = (arc4random() % 100)/100.0f; 
4

Está dividiendo un int por un int, lo que da un int. Necesita lanzar a un flotante:

float x = (arc4random() % 100)/(float)100; 

Consulte también mi comentario sobre el operador del módulo.

1

Para obtener una división flotador, en lugar de una división entera:

float x = arc4random() % 100/100.f; 

Pero tenga cuidado, usando % 100 sólo le dará un valor entre 0 y 99, por lo dividirlo por 100.f solo producirá un valor aleatorio entre 0.00f y 0.99f.

Mejor, para conseguir un flotador aleatorio entre 0 y 1:

float x = arc4random() % 101/100.f; 

Aún mejor, para evitar el sesgo módulo:

float x = arc4random_uniform(101)/100.f; 

mejor, para evitar el sesgo de precisión:

float x = (float)arc4random()/UINT32_MAX; 

Creo que en Swift sería:

let x = Float(arc4random())/UINT32_MAX