生成 0 到 1 之间的随机浮点数
我正在尝试生成一个介于 0 和 1 之间的随机数。我一直在阅读有关 arc4random()
的内容,但没有任何有关从中获取浮点数的信息。我该怎么做?
I'm trying to generate a random number that's between 0 and 1. I keep reading about arc4random()
, but there isn't any information about getting a float from it. How do I do this?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(12)
[0, 1[ 中的随机值(包括 0,不包括 1):
更多详细信息 此处。
实际范围为 [0, 0.999999999767169356],上限为 (double)0xFFFFFFFF / 0x100000000。
Random value in [0, 1[ (including 0, excluding 1):
A bit more details here.
Actual range is [0, 0.999999999767169356], as upper bound is (double)0xFFFFFFFF / 0x100000000.
对于 Swift 4.2+,请参阅:https://stackoverflow.com/a/50733095/1033581
以下是 ObjC 和 Swift 4.1 的正确一致性和最佳精度的建议。
32 位精度(
Float
的最佳选择)[0, 1] 中的统一随机值(包括 0.0 和 1.0),最高 32 位精度:
Obj-C :
Swift:
最适合:
Float
(或Float32
)尾数48 位精度(不鼓励)
使用
drand48
可以轻松实现 48 位精度(在底层使用arc4random_buf
)。但请注意 drand48 有缺陷,因为种子要求以及随机化所有 52 位双尾数的次优结果。[0, 1] 中的统一随机值,48 位精度:
Swift:
64 位精度(最适合
Double
和Float80< /code>)
[0, 1] 中的统一随机值(包括 0.0 和 1.0),最高 64 位精度:
Swift,使用两次 arc4random 调用:
Swift,使用对 arc4random_buf 的一次调用:
它最适合:
Double
(或Float64
),其尾数的有效数精度为 52 位注释
与其他方法的比较
范围不包括边界之一(0 或 1)的答案可能会受到均匀性偏差的影响,应避免。
arc4random()
,最佳精度为 1 / 0xFFFFFFFF (UINT32_MAX)arc4random_uniform()
,最佳精度为 1 / 0xFFFFFFFE (UINT32_MAX-1)rand( )
(秘密使用 arc4random),random()
的最佳精度是 1 / 0x7FFFFFFF (RAND_MAX) (秘密使用 arc4random),最佳精度为 1 / 0x7FFFFFFF (RAND_MAX)从数学上讲,通过一次调用
arc4random< 不可能达到高于 32 位的精度/code>、
arc4random_uniform
、rand
或random
。所以我们上面的32位和64位解决方案应该是我们能实现的最好的。For Swift 4.2+ see: https://stackoverflow.com/a/50733095/1033581
Below are recommendations for correct uniformity and optimal precision for ObjC and Swift 4.1.
32 bits precision (Optimal for
Float
)Uniform random value in [0, 1] (including 0.0 and 1.0), up to 32 bits precision:
Obj-C:
Swift:
It's optimal for:
Float
(orFloat32
) which has a significand precision of 24 bits for its mantissa48 bits precision (discouraged)
It's easy to achieve 48 bits precision with
drand48
(which usesarc4random_buf
under the hood). But note that drand48 has flaws because of the seed requirement and also for being suboptimal to randomize all 52 bits of Double mantissa.Uniform random value in [0, 1], 48 bits precision:
Swift:
64 bits precision (Optimal for
Double
andFloat80
)Uniform random value in [0, 1] (including 0.0 and 1.0), up to 64 bits precision:
Swift, using two calls to arc4random:
Swift, using one call to arc4random_buf:
It's optimal for:
Double
(orFloat64
) which has a significand precision of 52 bits for its mantissaFloat80
which has a significand precision of 64 bits for its mantissaNotes
Comparisons with other methods
Answers where the range is excluding one of the bounds (0 or 1) likely suffer from a uniformity bias and should be avoided.
arc4random()
, best precision is 1 / 0xFFFFFFFF (UINT32_MAX)arc4random_uniform()
, best precision is 1 / 0xFFFFFFFE (UINT32_MAX-1)rand()
(secretly using arc4random), best precision is 1 / 0x7FFFFFFF (RAND_MAX)random()
(secretly using arc4random), best precision is 1 / 0x7FFFFFFF (RAND_MAX)It's mathematically impossible to achieve better than 32 bits precision with a single call to
arc4random
,arc4random_uniform
,rand
orrandom
. So our above 32 bits and 64 bits solutions should be the best we can achieve.此函数也适用于负浮点范围:
This function works for negative float ranges as well:
Swift 4.2+
Swift 4.2 添加了对范围内随机值的本机支持:
文档:
随机(范围:范围)
随机(范围:ClosedRange)
随机(范围:范围)
随机(范围:ClosedRange)
随机(范围:Range)
Swift 4.2+
Swift 4.2 adds native support for a random value in a Range:
Doc:
random(in range: ClosedRange<Float>)
random(in range: Range<Float>)
random(in range: ClosedRange<Double>)
random(in range: Range<Double>)
random(in range: ClosedRange<Float80>)
random(in range: Range<Float80>)
上一篇文章单独指出“rand()”是不正确的。
这是使用 rand() 的正确方法。
这将创建一个 0 -> 之间的数字。 1
The previous post stating "rand()" alone was incorrect.
This is the correct way to use rand().
This will create a number between 0 -> 1
这是 Float 随机数 Swift 3.1 的扩展
This is extension for Float random number Swift 3.1
Swift 4.2
Swift 4.2 在标准库中包含了一个原生且功能相当齐全的随机数 API。 (Swift Evolution 提案 SE-0202)
所有数字类型都具有静态 random(in:) 函数它获取范围并返回给定范围内的随机数。
Swift 4.2
Swift 4.2 has included a native and fairly full-featured random number API in the standard library. (Swift Evolution proposal SE-0202)
All number types have the static random(in:) function which takes the range and returns the random number in the given range.
使用它可以避免 arc4random() 上限出现问题。
请注意,它适用于 MAC_10_7、IPHONE_4_3 及更高版本。
Use this to avoid problems with upper bound of arc4random()
Note that it is applicable for MAC_10_7, IPHONE_4_3 and higher.
arc4random 的范围最大为 0x100000000 (4294967296)
这是生成 0 到 1 之间随机数的另一个不错的选择:
arc4random
has a range up to 0x100000000 (4294967296)This is another good option to generate random numbers between 0 to 1:
这会产生 0 和 1 之间的随机浮点数。
更多信息在这里
That produces a random float bewteen 0 and 1.
More info here
默认情况下生成 0 到 1 之间的随机数(浮点数)。
by default produces a random number(float) between 0 and 1.