jin*_*ini 82 c random floating-point arc4random ios
我正在尝试生成一个介于0和1之间的随机数.我一直在阅读arc4random(),但是没有关于从中获取浮点数的任何信息.我该怎么做呢?
Vla*_*mir 136
[0,1 [(包括0,不包括1)中的随机值:
double val = ((double)arc4random() / UINT32_MAX);
Run Code Online (Sandbox Code Playgroud)
这里有更多细节.
实际范围是[0,0.999999999767169356],因为上限是(double)0xFFFFFFFF/0x100000000.
Jov*_*vic 106
// Seed (only once)
srand48(time(0));
double x = drand48();
// Swift version
// Seed (only once)
srand48(Int(Date().timeIntervalSince1970))
let x = drand48()
Run Code Online (Sandbox Code Playgroud)
drand48()和erand48()函数返回非负的,双精度的浮点值,均匀分布在区间[0.0,1.0]上.
Cœu*_*œur 16
对于Swift 4.2+,请参阅:https://stackoverflow.com/a/50733095/1033581
以下是ObjC和Swift 4.1的正确均匀性和最佳精度的建议.
Float)[0,1]中的均匀随机值(包括0.0和1.0),最高32位精度:
Obj-C:
float val = (float)arc4random() / UINT32_MAX;
Run Code Online (Sandbox Code Playgroud)
斯威夫特:
let val = Float(arc4random()) / Float(UInt32.max)
Run Code Online (Sandbox Code Playgroud)
它最适合:
Float(或Float32)其尾数的有效位精度为24位它很容易达到48位精度drand48(在引擎盖下使用arc4random_buf).但请注意,drand48由于种子需求而存在缺陷,并且对于将所有52位双尾数随机化而言也是次优的.
[0,1]中的均匀随机值,48位精度:
斯威夫特:
// seed (only needed once)
srand48(Int(Date.timeIntervalSinceReferenceDate))
// random Double value
let val = drand48()
Run Code Online (Sandbox Code Playgroud)
Double和Float80)[0,1]中的均匀随机值(包括0.0和1.0),最高64位精度:
Swift,使用两次对arc4random的调用:
let arc4random64 = UInt64(arc4random()) << 32 &+ UInt64(arc4random())
let val = Float80(arc4random64) / Float80(UInt64.max)
Run Code Online (Sandbox Code Playgroud)
Swift,使用一次对arc4random_buf的调用:
var arc4random64: UInt64 = 0
arc4random_buf(&arc4random64, MemoryLayout.size(ofValue: arc4random64))
let val = Float80(arc4random64) / Float80(UInt64.max)
Run Code Online (Sandbox Code Playgroud)
它最适合:
Double(或Float64)其尾数的有效位精度为52位Float80尾数的有效位精度为64位范围排除其中一个边界(0或1)的答案可能会受到均匀性偏差的影响,应该避免.
arc4random(),最佳精度为1/0xFFFFFFFF(UINT32_MAX)arc4random_uniform(),最佳精度为1/0xFFFFFFFE(UINT32_MAX-1)rand()(秘密使用arc4random),最佳精度为1/0x7FFFFFFF(RAND_MAX)random()(秘密使用arc4random),最佳精度为1/0x7FFFFFFF(RAND_MAX)这是数学上是不可能有一个调用来实现优于32位精度arc4random,arc4random_uniform,rand或random.因此,我们的32位和64位解决方案应该是我们能够实现的最佳解决方案.
小智 10
此函数也适用于负浮点范围:
float randomFloat(float Min, float Max){
return ((arc4random()%RAND_MAX)/(RAND_MAX*1.0))*(Max-Min)+Min;
}
Run Code Online (Sandbox Code Playgroud)
Swift 4.2为范围内的随机值添加了本机支持:
let x = Float.random(in: 0.0...1.0)
let y = Double.random(in: 0.0...1.0)
let z = Float80.random(in: 0.0...1.0)
Run Code Online (Sandbox Code Playgroud)
文件:
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>)| 归档时间: |
|
| 查看次数: |
59544 次 |
| 最近记录: |