programing

0과 1 사이의 랜덤 부동 생성

yoursource 2022. 8. 14. 14:56
반응형

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)

문서:

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

반응형