Dari alamat email ke nomor acak semu [ditutup]

10

Tujuan saya:

Saya ingin memiliki fungsi yang mengambil alamat email dan mengeluarkan angka acak semu 1, 2, 3, atau 4.

Sedikit detail:

Dengan kuasi-acak nomor yang saya maksudkan bahwa mengingat populasi khas dari alamat email, probabilitas mendapatkan nilai 1, 2, 3, atau 4 kira-kira sama, dan sifat sistematis yang jelas dari alamat email seperti nama domain yang dikerjakan. tidak mempengaruhi probabilitas mendapatkan nilai 1, 2, 3, atau 4.

Sedikit latar belakang:

Saya memiliki eksperimen online yang ditulis dalam inquisit di mana peserta masuk dua kali. Saya ingin menetapkan peserta secara acak ke salah satu dari empat kelompok. Meskipun ini mudah dilakukan untuk satu sesi (saya bisa menggunakan generator angka acak), saya perlu cara mengingat alokasi di seluruh sesi. Jadi, saya berpikir bahwa saya dapat mengekstrak alokasi grup acak-acak dari email peserta. Saya juga terbatas dalam rangkaian fungsi yang saya miliki ( lihat di sini untuk daftar lengkap ). Fungsi string adalah: Tolerer toupper capitalize concat search replall berisi mulai dengan akhir dengan substring trim trimright trimleft format panjang mengevaluasi

Pikiran Awal:

Saya berpikir untuk mencoba mengekstrak serangkaian fitur dari alamat email yang mengembalikan nilai 1, 2, 3, atau 4 dengan probabilitas yang kira-kira sama. Lalu, saya bisa menjumlahkan properti ini dan mendapatkan mod 4 plus 1 itu. Jadi, dengan asumsi sesuatu seperti teorema limit pusat, saya mungkin mendekati.

Kemungkinan fitur yang muncul di benak saya:

  • panjang tali
  • posisi "a", "b" pertama, dll.
Jeromy Anglim
sumber
1
Masalah yang sangat menarik. Apakah Anda memiliki sampel "populasi khas alamat email"? Selain itu tidak dijamin, bahwa alamat email para pengunjung memiliki struktur yang sama / berbeda, tetapi karena Anda hanya mencari perkiraan .... Pertanyaan kedua: Apakah Anda dapat mengatur seed dari RNG?
steffen
6
Kedengarannya seperti Anda menginginkan 'fungsi hash': en.wikipedia.org/wiki/Hash_function Ini ada di ranah ilmu komputer daripada statistik, jadi saya tidak yakin itu milik CrossValidated.
onestop
1
hmpf;) ... Saya bermaksud menulis yang sama. @Jeromy: Khususnya bagian situs ini ( en.wikipedia.org/wiki/... ) dapat menarik bagi Anda.
steffen
@onestop Terima kasih atas tipnya tentang hashtag. Berkenaan dengan apakah pertanyaannya adalah pada topik untuk situs, saya pikir alokasi acak peserta untuk kelompok secara inheren terkait dengan desain studi, yang pada gilirannya terkait dengan kesimpulan dari data.
Jeromy Anglim
1
@ Jeremy Fungsi hash sama sekali bukan sebagai hashtag! Saya mengerti maksud Anda tentang desain studi. Saya akui tidak membaca seluruh pertanyaan Anda dengan benar.
onestop

Jawaban:

3

Mengapa tidak hanya mencari tabel angka untuk setiap karakter yang mungkin ada dalam email. Kemudian gabungkan angka-angka untuk membentuk benih. Sebagai contoh,

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

Jadi abc @ ccc, akan dikonversi ke 12327333. Ini akan memberi Anda seed unik untuk setiap orang. Anda kemudian akan menggunakan ini untuk menghasilkan 1, 2, 3, 4.


Dari pertanyaan Anda, sepertinya Anda tidak keberatan dengan "solusi cepat dan kotor". Satu masalah dengan solusi saya adalah bahwa alamat email tidak acak - misalnya Anda mungkin akan mendapatkan sangat sedikit alamat email yang berisi huruf "z", tetapi semua alamat email berisi "@".

csgillespie
sumber
Catatan kecil tentang metode di atas adalah bahwa ada banyak karakter yang valid dalam alamat email - tanda baca pada khususnya - yang ingin Anda pertimbangkan jika Anda melakukan ini.
dsolimano
@dsol: Saya setuju. Anda dapat dengan mudah tertangkap dengan "+" di alamat email. Untuk solusi cepat dan kotor, saya mungkin hanya akan melewatkan karakter tanda baca yang tidak saya tentukan dalam tabel pencarian saya.
csgillespie
1

Sebagai tambahan untuk jawaban luar biasa lainnya, saya hanya akan memberikan contoh sederhana dalam bahasa R untuk menunjukkan fungsi hash yang sangat sederhana, yang seharusnya cukup baik untuk tujuan ini. Untuk mendapatkan beberapa alamat email sebagai data pengujian, saya mendapatkan vektor karakter dengan email dari pengelola paket R (terlalu banyak!) Yang diinstal di komputer saya:

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)

Lalu saya mendefinisikan fungsi sederhana yang mendapatkan beberapa nomor dari setiap karakter di alamat email, menambahkannya, menghitung modulo 4 sisanya dan menambahkan 1, sehingga selalu mengembalikan salah satu hasil 1,2,3 atau 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

Kemudian menerapkannya:

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

dan kita dapat mengamati bahwa distribusi yang dihasilkan dekat dengan seragam.

kjetil b halvorsen
sumber
0

Anda dapat mencoba mengubah setiap karakter menjadi angka ascii, mengalikannya semua menjadi paksa, dan kemudian melakukan operasi modulus pada digit paling tidak signifikan. Jika ini tidak cukup pseudo-acak, Anda dapat melakukan sedikit-menggeser angka sedikit ...

-Ralph Winters

Ralph Winters
sumber
2
Mengalikan bukanlah ide terbaik, saya pikir. Terutama jika overflow awal Anda adalah yang biasa - modulo beberapa kekuatan 2. Anda akan mendapatkan banyak faktor yang genap, sehingga sebagian besar bit Anda yang lebih rendah akan menjadi 0. Menambahkan angka bersama bukan akan sudah jauh lebih baik. Jika Anda membutuhkan keacakan yang lebih baik lagi, gunakan semacam fungsi hash dan gunakan bit hasilnya. Jika Anda ingin sulit menebak apa pun tentang hasil untuk orang lain selain Anda, gunakan fungsi hash kriptografi yang asin yang kuat.
Erik P.
Sepakat. Hanya ingin menyarankan ide untuk menggambarkan pergeseran bit untuk menghasilkan (kira-kira) angka pseudo-acak.
Ralph Winters