の無制限のユーザーからp%のユーザーを公平にサンプリングするアルゴリズムを探しています。ユーザーイベントストリームでユーザーのp%を無作為にサンプリングする方法
素朴なアルゴリズムは次のようになります。
//This is naive.. what is a better way??
def userIdToRandomNumber(userId: Int): Float = userId.toString.hashCode % 1000)/1000.0
//An event listener will call this every time a new event is received
def sampleEventByUserId(event: Event) = {
//Process all events for 3% percent of users
if (userIdToRandomNumber(event.user.userId) <= 0.03) {
processEvent(event)
}
}
は、(モジュロ演算等、そのない正確のpので、値を離散化され、ハッシュコードは短い文字列を好む場合があります)しかし、このコードに問題があります。
上記の関数userIdToRandomNumber
の乱数に対するuserId
の確定的なマッピングを見つける "より正確な"方法はありましたか?ここで
Niceですが、 'modN()'は単に 's.sum%n'を返すことができます。 – jwvh
@jwvh良いキャッチ! – radumanolescu