0과 1 사이의 랜덤 부동 생성
0에서 1 사이의 난수를 생성하려고 합니다.계속 읽어요arc4random()
하지만 그것으로부터 부유물을 얻는 것에 대한 정보는 없습니다.이거 어떻게 해?
[0, 1]의 랜덤 값(0, 1 제외):
double val = ((double)arc4random() / UINT32_MAX);
좀 더 자세히 설명해 주세요.
상한은 0xFFFF/0x100000000이므로 실제 범위는 [0, 0.999999767169356]입니다.
// Seed (only once)
srand48(time(0));
double x = drand48();
// Swift version
// Seed (only once)
srand48(Int(Date().timeIntervalSince1970))
let x = drand48()
drand48() 및 erand48() 함수는 음이 아닌 2배 정밀도의 부동 소수점 값을 반환합니다.이 값은 [0.0, 1.0]간격으로 균일하게 분산됩니다.
Swift 4.2 이상
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)
문서:
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>)
Swift 4.2+ 에 대해서는, https://stackoverflow.com/a/50733095/1033581 를 참조해 주세요.
다음은 ObjC 및 Swift 4.1의 정확한 균일성과 최적의 정밀도를 위한 권장 사항입니다.
32비트 정밀도 (최적)Float
)
[0, 1](0.0 및 1.0 포함)의 균일한 랜덤 값, 최대 32비트 정밀도:
Obj-C:
float val = (float)arc4random() / UINT32_MAX;
신속:
let val = Float(arc4random()) / Float(UInt32.max)
다음과 같은 용도에 최적입니다.
- a
Float
(또는Float32
)는 그 가수에 대해 24비트의 유의도와 정밀도를 가진다.
48비트 정밀도(에이징 완료)
48비트의 정밀도를 실현하는 것은 간단합니다.drand48
(후드 아래에 사용).단, drand48에는 시드 요건과 Double mortisa의 52비트를 모두 랜덤화하는 차선상의 결함이 있습니다.
[0, 1], 48비트 정밀도의 균일한 랜덤 값:
신속:
// seed (only needed once)
srand48(Int(Date.timeIntervalSinceReferenceDate))
// random Double value
let val = drand48()
64비트 정밀도 (최적)Double
그리고.Float80
)
[0, 1](0.0 및 1.0 포함)의 균일한 랜덤 값, 최대 64비트 정밀도:
Swift, 2개의 콜을 사용하여 arc4random:
let arc4random64 = UInt64(arc4random()) << 32 &+ UInt64(arc4random())
let val = Float80(arc4random64) / Float80(UInt64.max)
swift, arc4random_buf에 대한 호출을 1회 사용합니다.
var arc4random64: UInt64 = 0
arc4random_buf(&arc4random64, MemoryLayout.size(ofValue: arc4random64))
let val = Float80(arc4random64) / Float80(UInt64.max)
다음과 같은 용도에 최적입니다.
- a
Double
(또는Float64
)는 그 가수에 대해 52비트의 유의도와 정밀도를 가진다. - a
Float80
그 가수에 대해 64비트의 의미와 정밀도를 가지고 있다.
메모들
다른 방법과의 비교
범위가 범위(0 또는 1) 중 하나를 제외한 답변은 균일성 편향을 겪을 수 있으므로 피해야 합니다.
- 사용.
arc4random()
, 최적 정밀도는 1/0xFFFFFF (UINT32_MAX) - 사용.
arc4random_uniform()
, 최적 정밀도는 1/0xFFFFE(UINT32_MAX-1)입니다. - 사용.
rand()
(은밀하게 arc4random을 사용), 최적의 정밀도는 1/0x7FFFFFF(RAND_MAX)입니다. - 사용.
random()
(은밀하게 arc4random을 사용), 최적의 정밀도는 1/0x7FFFFFF(RAND_MAX)입니다.
의 32비트 콜로 의 정밀도를 합니다.arc4random
,arc4random_uniform
,rand
★★★★★★★★★★★★★★★★★」random
따라서 위의 32비트 및 64비트 솔루션이 우리가 달성할 수 있는 최선의 솔루션이어야 합니다.
스위프트 4.2
Swift 4.2는 표준 라이브러리에 네이티브로 완전 기능을 갖춘 난수 API를 포함했습니다.(Swift Evolution 제안 SE-0202)
let intBetween0to9 = Int.random(in: 0...9)
let doubleBetween0to1 = Double.random(in: 0...1)
모든 번호 유형에는 범위를 가져와서 지정된 범위의 난수를 반환하는 정적 랜덤(in:) 함수가 있습니다.
Float 난수 Swift 3.1의 확장자입니다.
// MARK: Float Extension
public extension Float {
/// Returns a random floating point number between 0.0 and 1.0, inclusive.
public static var random: Float {
return Float(arc4random()) / Float(UInt32.max))
}
/// Random float between 0 and n-1.
///
/// - Parameter n: Interval max
/// - Returns: Returns a random float point number between 0 and n max
public static func random(min: Float, max: Float) -> Float {
return Float.random * (max - min) + min
}
}
이 기능은 음의 부동 범위에도 작동합니다.
float randomFloat(float Min, float Max){
return ((arc4random()%RAND_MAX)/(RAND_MAX*1.0))*(Max-Min)+Min;
}
arc4random() 상한 문제를 방지하려면 이 옵션을 사용합니다.
u_int32_t upper_bound = 1000000;
float r = arc4random_uniform(upper_bound)*1.0/upper_bound;
MAC_10_7, iPhone_4_3 이상에 적용됩니다.
arc4random
의 범위가 있습니다.
0 ~ 1의 난수를 생성하기 위한 또 하나의 좋은 옵션입니다.
srand48(time(0)); // pseudo-random number initializer.
double r = drand48();
float x = arc4random() % 11 * 0.1;
그러면 0과 1 사이에 랜덤 플로트가 생성됩니다.자세한 내용은 이쪽
rand()
기본적으로는 0과 1 사이의 난수(소수)를 생성합니다.
(float)rand() / RAND_MAX
rand()라고 기재되어 있는 앞의 투고는 올바르지 않습니다.이것이 rand()를 사용하는 올바른 방법입니다.
0 ~ > 1 사이의 숫자가 생성됩니다.
BSD 문서:
는 therand()의 정수 시퀀스를 계산합니다.
~ 의 파일 0 ~ LAND_MAX」 로 ).h")
언급URL : https://stackoverflow.com/questions/5172421/generate-a-random-float-between-0-and-1
'programing' 카테고리의 다른 글
발기부전이란 무엇이며 어떻게 사용하는가? (0) | 2022.08.14 |
---|---|
vue.js의 어레이에 항목이 이미 있는지 확인하는 방법 (0) | 2022.08.14 |
라우터 뷰에서 외부 컴포넌트로의 Vuej (0) | 2022.08.14 |
Java에서 패키지를 문서화하는 방법 (0) | 2022.08.14 |
Vue-Router의 내비게이션가드에서 뒤로 버튼 검출 (0) | 2022.08.14 |