如何在Objective-C中创建随机浮点?
我试图在Objective-C中创建一个介于0.15和0.3之间的随机浮点。以下代码始终返回1:如何在Objective-C中创建随机浮点?,objective-c,random,floating-point,Objective C,Random,Floating Point,我试图在Objective-C中创建一个介于0.15和0.3之间的随机浮点。以下代码始终返回1: int randn = (random() % 15)+15; float pscale = (float)randn / 100; 我做错了什么?试试这个: (float)rand() / RAND_MAX 或获取介于0和5之间的值: float randomNum = ((float)rand() / RAND_MAX) * 5; 有几种方法可以做同样的事情 使用arc4random(
int randn = (random() % 15)+15;
float pscale = (float)randn / 100;
我做错了什么?试试这个:
(float)rand() / RAND_MAX
或获取介于0和5之间的值:
float randomNum = ((float)rand() / RAND_MAX) * 5;
有几种方法可以做同样的事情
float pscale = ((float)randn) / 100.0f;
您的代码适用于我,它生成一个介于0.15和0.3之间的随机数(如果我使用
srandom()
进行种子设定)。在第一次调用random()
之前,您是否调用过srandom()
?您需要为srandom()
提供一些熵值(很多人只使用srandom(time(NULL))
)
对于更严重的随机数生成,请查看用于加密目的的。此随机数函数还返回整数类型,因此您仍需要将结果强制转换为浮点类型。这里是一个函数
- (float)randomFloatBetween:(float)smallNumber and:(float)bigNumber {
float diff = bigNumber - smallNumber;
return (((float) (arc4random() % ((unsigned)RAND_MAX + 1)) / RAND_MAX) * diff) + smallNumber;
}
当您需要使用一些浮盐进行真正的随机化时,使用srandom()和rand()是不安全的
在MAC_10_7、IPHONE_4_3及更高版本上,您可以使用arc4random_uniform(上限)*。
它允许生成从零到*上限*的真随机整数
所以你可以试试下面的方法
u_int32_t upper_bound = <some big enough integer>;
float r = 0.3 * (0.5 + arc4random_uniform(upper_bound)*1.0/upper_bound/2);
u_int32_t上界=;
浮点r=0.3*(0.5+arc4random_均匀(上界)*1.0/上界/2);
我最终生成了一个整数,一个是实际整数,一个是十进制整数。然后我将它们连接在一个字符串中,然后用“floatvalue”函数将其解析为floatvalue。。。我找不到更好的方法,这符合我的意图,希望能有所帮助:)
最简单的
+ (float)randomNumberBetween:(float)min maxNumber:(float)max
{
return min + arc4random_uniform(max - min + 1);
}
要添加到@Caladain的答案中,如果您希望解决方案像
rand()
一样易于使用,您可以定义以下内容:
#define randf() ((CGFloat)rand() / RAND_MAX)
#define randf_scaled(scale) (((CGFloat)rand() / RAND_MAX) * scale)
如果您没有访问CoreGraphics的权限,可以将
CGFloat
替换为double
。这是错误的random()/RAND_MAX
不会为您提供浮点值,因为两个值都不是浮点值。另外,random()
的域不是0到RAND\u MAX。而RAND()
和RAND\u r()
的域是。因此,您应该使用:(float)rand()/rand_MAX
来获得预期的结果。这是错误的(rand()/rand_MAX)将为您提供零。Jonathan的评论是正确的。#定义boris_random(smallNumber,bigNumber)(((浮点)(arc4random()((无符号)RAND_MAX+1))/RAND_MAX)*(bigNumber-smallNumber))+smallNumber)@chunkyguy,你能用arc4random_uniform
重写这个答案吗?这段代码似乎很有效,仍然使用100.0f更好。我能猜到的唯一一种情况是,你把这段代码放在一个函数中,而不是在.h中声明它,所以编译器可能会将它升级为double。这是一种令人惊讶的复杂方法来做一件简单的事情,甚至是不正确的。(例如,它永远无法生成1.01
)
#define randf() ((CGFloat)rand() / RAND_MAX)
#define randf_scaled(scale) (((CGFloat)rand() / RAND_MAX) * scale)