objective c - Generar números aleatorios entre dos números en Objective-C
random arc4random (6)
Tengo dos cuadros de texto y el usuario puede ingresar 2 enteros positivos (usando Objective-C). El objetivo es devolver un valor aleatorio entre los dos números.
He usado "man arc4random" y aún no puedo entenderlo. He encontrado un código pero tiene errores.
float lowerBound = lowerBoundNumber.text.floatValue;
float upperBound = upperBoundNumber.text.floatValue;
float rndValue;
//if lower bound is lowerbound < higherbound else switch the two around before randomizing.
if(lowerBound < upperBound)
{
rndValue = (((float)arc4random()/0x100000000)*((upperBound-lowerBound)+lowerBound));
}
else
{
rndValue = (((float)arc4random()/0x100000000)*((lowerBound-upperBound)+upperBound));
}
Ahora mismo si pongo los valores 0 y 3 parece que funciona bien. Sin embargo, si uso los números 10 y 15, aún puedo obtener valores tan bajos como 1.0000000 o 2.000000 para "rndValue".
¿Necesito elaborar mi algoritmo o necesito cambiar la forma en que uso arc4random?
Debería evitar fijar valores con mod (%) si puede, porque incluso si el generador de números pseudoaleatorios que está utilizando (como arc4random
) es bueno para proporcionar números distribuidos uniformemente en todo su rango, puede que no proporcione números uniformemente distribuidos. dentro del rango de módulo restringido.
Tampoco necesita usar un literal como 0x100000000
porque hay una constante conveniente disponible en stdint.h:
(float)arc4random() / UINT32_MAX
Eso te dará un flotador aleatorio en el intervalo [0,1]. Tenga en cuenta que arc4random
devuelve un número entero en el intervalo [0, 2 ** 32 - 1].
Para mover esto al intervalo que desee, solo agregue su valor mínimo y multiplique el flotante aleatorio por el tamaño de su rango:
lowerBound + ((float)arc4random() / UINT32_MAX) * (upperBound - lowerBound);
En el código que ha publicado, está multiplicando la flotación aleatoria por todo el desorden (lowerBound + (upperBound - lowerBound)), que en realidad es igual a upperBound. Y es por eso que aún obtienes resultados inferiores a tu límite inferior previsto.
El siguiente código incluye el valor mínimo Y MÁXIMO como el número de salida aleatorio:
- (NSInteger)randomNumberBetween:(NSInteger)min maxNumber:(NSInteger)max
{
return min + arc4random_uniform((uint32_t)(max - min + 1));
}
Actualizar:
Edité la respuesta reemplazando arc4random() % upper_bound
con arc4random_uniform(upper_bound)
como se sugirió @rmaddy.
Y aquí está la referencia de arc4random_uniform para los detalles.
Actualización2:
Actualicé la respuesta insertando un molde en uint32_t en arc4random_uniform()
como @bicycle indicado.
Simplemente podría usar valores enteros como este:
int lowerBound = ...
int upperBound = ...
int rndValue = lowerBound + arc4random() % (upperBound - lowerBound);
¿O si quiere decir que desea incluir el número de flotante entre lowerBound y upperBound? Si es así, consulte esta pregunta: https://.com/a/4579457/1265516
En Swift:
let otp = Int(arc4random_uniform(6))
Prueba esto.
Función Objective-C :
-(int)getRandomNumberBetween:(int)from to:(int)to
{
return (int)from + arc4random() % (to-from+1);
}
Rápido:
func getRandomNumberBetween(_ from: Int, to: Int) -> Int
{
return Int(from) + arc4random() % (to - from + 1)
}
Llámalo a cualquier lugar por :
int OTP = [self getRandomNumberBetween:10 to:99];
NSLog(@"OTP IS %ld",(long)OTP);
NSLog(@"OTP IS %@",[NSString stringWithFormat @"%ld",(long)OTP]);
Para Swift:
var OTP: Int = getRandomNumberBetween(10, to: 99)
-(int) generateRandomNumberWithlowerBound:(int)lowerBound
upperBound:(int)upperBound
{
int rndValue = lowerBound + arc4random() % (upperBound - lowerBound);
return rndValue;
}