2017-06-14 57 views
1

可以说我正在计算1到100的随机数。我想要的数字是随机选择的,但有偏差我可以设置它更可能选择的位置中心。因此,如果我做随机样本可以说一千次,那么会有一个明显的相关性,即中心数字被更频繁地选择。它选择中心的数量应该基于我可以在我的didHitChanceOf函数中设置的数字。做这个的最好方式是什么?Swift 3:如何用偏好计算随机数以偏向偏好

当前的代码我有没有做到这一点,甚至翻过它随机性

当前不带偏见的随机编码(SWIFT 3)

extension Int 
{ 
    static func random(range: ClosedRange<Int>) -> Int 
    { 
     var offset = 0 

     if range.lowerBound < 0 // allow negative ranges 
     { 
      offset = abs(range.lowerBound) 
     } 

     let mini = UInt32(range.lowerBound + offset) 
     let maxi = UInt32(range.upperBound + offset) 

     return Int(mini + arc4random_uniform(maxi - mini)) - offset 
    } 
} 

func didHitChanceOf(chance: Double) -> Bool{ 
     let random = Int.random(range: 0...100) 
     if(Double(random) < chance){ //If the conversion rate is 20%, then only 20% of the time will the random number be less than the conversion rate. 
      return true 
     }else{ 
      return false 
     } 
    } 
var adwordsClicks = 500 
let adwordsConversionRate = 20 
var adwordsConversions = 0 
for _ in 0...adwordsClicks { 
      if(didHitChanceOf(chance: adwordsConversionRate) == true){ 
       adwordsConversions = adwordsConversions + 1 
      } 
     } 

回答

4

您可以使用GKGaussianDistribution板(也称为正态分布)来做到这一点。您将需要2个参数:mean(以下简称“中心”,你的愿望)和deviation(它应该有多远从中心扩散):

import GameKit 

func random(count: Int, in range: ClosedRange<Int>, mean: Int, deviation: Int) -> [Int] { 
    guard count > 0 else { return [] } 

    let randomSource = GKARC4RandomSource() 
    let randomDistribution = GKGaussianDistribution(randomSource: randomSource, mean: Float(mean), deviation: Float(deviation)) 

    // Clamp the result to within the specified range 
    return (0..<count).map { _ in 
     let rnd = randomDistribution.nextInt() 

     if rnd < range.lowerBound { 
      return range.lowerBound 
     } else if rnd > range.upperBound { 
      return range.upperBound 
     } else { 
      return rnd 
     } 
    } 
} 

使用和测试:

let arr = random(count: 1_000_000, in: 0...100, mean: 70, deviation: 10) 

let summary = NSCountedSet(array: arr) 
for i in 0...100 { 
    print("\(i): \(summary.count(for: i))") 
} 

你可以看到70左右的值有最高的计数

+0

非常有趣的方法。我会试试这个报告。 –

+0

拒绝比钳位太低或太高的值更好。当然,在拒绝或钳制的情况下,它不再是高斯分布。 –