メールアドレスから疑似乱数まで[終了]


10

私の目的:

メールアドレスを取り、1、2、3、4の疑似乱数を出力する機能が欲しいのですが。

少し詳細:

準乱数とは、電子メールアドレスの一般的な母集団が与えられた場合、1、2、3、または4の値を取得する確率はほぼ同じであること、およびドメイン名などの電子メールアドレスの明らかな体系的なプロパティは、 1、2、3、または4の値を取得する確率には影響しません。

少し背景:

私は質問に書かれたオンライン実験を行っており、参加者は2回ログインします。参加者を4つのグループのいずれかにランダムに割り当てたい。これは1つのセッションで簡単に実行できますが(乱数ジェネレーターを使用できます)、セッション間の割り当てを覚えておく方法が必要です。したがって、参加者のメールから準ランダムなグループ割り当てを抽出できると思いました。また、私が自由に使用できる一連の機能にも制限があります(完全なリストについては、こちらを参照してください)。文字列関数は、次のとおりです。

最初の考え:

ほぼ等しい確率で1、2、3、または4の値を返すメールアドレスの機能のセットを抽出しようと考えました。次に、これらのプロパティを合計して、mod 4 + 1を取得します。したがって、中心極限定理のようなものを想定すると、私は近づくかもしれません。

私の頭に浮かんだ可能な機能:

  • 文字列の長さ
  • 最初の「a」、「b」などの位置

1
非常に興味深い問題です。手元にある「電子メールアドレスの一般的な母集団」のサンプルはありますか?さらに、訪問者のメールアドレスが同じ別の/異なる構造を持っていることは保証されていませんが、近似値を探しているだけなので... 2番目の質問:RNGのシードを設定できますか?
steffen

6
「ハッシュ関数」が必要なようです:en.wikipedia.org/wiki/Hash_function ただし、これは統計ではなくコンピューターサイエンスの領域にあるため、CrossValidatedに属しているとは思えません。
ワンストップ

1
hmpf;)...同じことを書くつもりでした。@Jeromy:特にサイトのこの部分(en.wikipedia.org/wiki/…)は興味深いかもしれません。
steffen

@onestopハッシュタグについてのヒントをありがとう。質問がサイトのトピックに関するものであるかどうかに関しては、グループへの参加者のランダムな割り当ては本質的に研究デザインに関連しており、それはデータからの推論に関連していると思います。
Jeromy Anglim 2011

1
@ジェレミーハッシュ関数はハッシュタグとまったく同じではありません!でも、スタディデザインについてのあなたのポイントはわかります。質問全体を正しく読んでいないことを認めます。
ワンストップ2011

回答:



3

電子メール内の可能な各文字の数字のルックアップテーブルを用意しないのはなぜですか。次に、数値を連結してシードを形成します。例えば、

A 1
B 2
C 3
....
@ 27
....

したがって、abc @ cccは12327333に変換されます。これにより、各ユーザーに一意のシードが与えられます。次に、これを使用して1、2、3、4を生成します。


あなたの質問から、あなたは「迅速で汚い解決策」を気にしないように見えます。私の解決策の1つの問題は、電子メールアドレスがランダムではないことです。たとえば、「z」の文字を含む電子メールアドレスはほとんどありませんが、すべての電子メールアドレスには「@」が含まれます。


上記の方法についてのマイナーな注意事項は、電子メールアドレスに多数の有効な文字(特に句読点)があり、これを行う場合に検討する必要があることです。
dsolimano

@dsol:同意する。メールアドレスに「+」が含まれていると、簡単に気付く可能性があります。すばやく簡単な解決策として、ルックアップテーブルで指定していない句読点文字をスキップするだけでしょう。
csgillespie、2011

1

他の優れた回答への追加として、R言語での単純な例を示し、非常に単純なハッシュ関数を示します。これは、この目的には十分なはずです。一部の電子メールアドレスをテストデータとして取得するために、コンピューターにインストールされている(多すぎる!)Rパッケージのメンテナーの電子メールを含む文字ベクトルを取得します。

library(stringr) # on CRAN 
last <- function(x) { return( x[length(x)] ) }

INST  <-  installed.packages(priority="NA", fields=c("Maintainer"))
Maintainer <- INST[, "Maintainer"]
Mlist <- str_split(Maintainer, "[[:blank:]]")
Maddr <- sapply(Mlist, FUN=last)
Maddr <- str_replace(Maddr, "[<>]", "")
Maddr <- unique(Maddr)

次に、電子メールアドレスの各文字からいくつかの数値を取得し、それらを追加し、剰余4を計算して1を追加する単純な関数を定義します。これにより、結果1、2、3または4のいずれかが常に返されます。

apply_to_each_char  <-  function(w, FUN) {
    ww <-  str_split(w, "")[[1]]
    res <- sapply(ww, FUN)
    } # END apply_to_each_char
charsum <- function(word) { # length-one char vector
    sum0 <- sum( apply_to_each_char(word, function(w) as.integer(charToRaw(w)) ))
    return( 1 + sum0 %% 4)
    } # end charsum

次にそれを適用します:

hashes <- sapply(Maddr, charsum)
table(hashes)
hashes
  1   2   3   4 
542 511 562 552 

結果の分布が均一に近いことがわかります。


0

各文字をASCII数に変換し、それらをすべて掛け合わせて強制的にオーバーフローさせてから、最下位桁でモジュラス演算を実行することもできます。これが疑似ランダムでは十分でない場合は、数値を少しビットシフトすることができます...

-ラルフ冬


2
掛け算は最高のアイデアではないと思います。特に、最初のオーバーフローが通常のオーバーフローである場合-2のべき乗を法として、多くの偶数の要素が得られるため、下位ビットのほとんどが0になります。代わりに数値を加算すると、はるかに優れています。さらに優れたランダム性が必要な場合は、何らかのハッシュ関数を使用して、結果の任意のビットを使用します。あなた以外の人の結果について推測するのが難しい場合は、saltされた強力な暗号化ハッシュ関数を使用してください。
エリック

同意した。(ほぼ)疑似乱数を生成するためにビットシフトを説明するアイデアを提案したかっただけです。
Ralph Winters
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.