Bir e-posta adresinden yarı rastgele bir sayıya [kapalı]


10

Hedefim:

Bir e-posta adresi alan ve 1, 2, 3 veya 4 gibi rasgele bir sayı çıktısı bir işleve sahip olmak istiyorum.

Biraz detay:

Yarı rastgele sayı ile, tipik bir e-posta adresi popülasyonu verildiğinde, 1, 2, 3 veya 4 değerini elde etme olasılıklarının kabaca eşit olduğunu ve e-posta adresinin alan adı gibi bariz sistematik özelliklerinin 1, 2, 3 veya 4 değerini alma olasılığını etkilemez.

Biraz arka plan:

Katılımcıların iki kez oturum açtıkları soruyla yazılı bir çevrimiçi denemem var . Dört gruptan birine rastgele katılımcı atamak istiyorum. Bu bir oturum için yapmak kolay olsa da (ben sadece rastgele bir sayı üreteci kullanabilirsiniz), ben oturumlar arasında tahsisi hatırlamak için bir yol gerekir. Böylece, katılımcı e-postasından yarı rastgele bir grup ayırması yapabileceğimi düşündüm. Ayrıca elimdeki fonksiyonlar setiyle de sınırlıyım ( tam liste için buraya bakınız ). Dize fonksiyonları şunlardır: tolower toupper büyük harfli concat arama replaceall tüm başlangıç ​​içerir alt dize trim trimright trimleft uzunluk biçimi değerlendirme

İlk Düşünceler:

E-posta adresinin kabaca eşit olasılıklarla 1, 2, 3 veya 4 değerini döndüren bir dizi özelliği çıkarmaya çalışmayı düşündüm. Sonra, bu özellikleri toplamak ve mod 4 artı 1 olsun. Böylece, merkezi limit teoremi gibi bir şey varsayarsak, yakınlaşabilirim.

Aklıma gelen olası özellikler:

  • ipin uzunluğu
  • ilk "a", "b" vb. konumlar.

1
Çok ilginç bir problem. Eldeki "tipik e-posta adresi popülasyonu" örneğiniz var mı? Buna ek olarak, ziyaretçilerin e-posta adreslerinin aynı / farklı bir yapıya sahip olduğu garanti edilmez, ancak yalnızca bir yaklaşım arıyorsanız ... İkinci soru: RNG'nin tohumunu ayarlayabiliyor musunuz?
steffen

6
Bir 'hash işlevi' istediğiniz gibi geliyor: en.wikipedia.org/wiki/Hash_function Bu istatistik yerine bilgisayar bilimi alemlerinde, bu yüzden CrossValidated'a ait olduğundan emin değilim.
onestop

1
hmpf;) ... Ben de aynısını yazmak istedim. @Jeromy: Özellikle sitenin bu bölümü ( en.wikipedia.org/wiki/… ) sizin için ilginç olabilir.
steffen

@onestop Hashtaglerle ilgili ipucu için teşekkürler. Sorunun site için konuyla ilgili olup olmadığı ile ilgili olarak, katılımcıların gruplara rastgele tahsis edilmesinin doğası gereği çalışma tasarımı ile ilişkili olduğunu ve bunun da verilerden çıkarımlarla ilişkili olduğunu düşünüyorum.
Jeromy Anglim

1
@Jeremy Bir hash işlevi, bir hashtag ile aynı şey değildir! Yine de çalışma tasarımı hakkındaki görüşünüzü görüyorum. Sorunuzun tamamını düzgün okumadığımı itiraf ediyorum.
onestop

Yanıtlar:



3

Neden bir e-postadaki her olası karakter için bir arama tablosu tablosu olmasın? Sonra bir tohum oluşturmak için sayıları birleştirin. Örneğin,

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

Yani abc @ ccc, 12327333'e dönüştürülür. Bu size her kişi için eşsiz bir tohum verir. Daha sonra bunu 1, 2, 3, 4 üretmek için kullanırsınız.


Sorunuzdan, "hızlı ve kirli bir çözümü" önemsemediğiniz anlaşılıyor. Çözümümle ilgili bir sorun, e-posta adreslerinin rastgele olmamasıdır - örneğin, muhtemelen "z" harfini içeren çok az e-posta adresi alırsınız, ancak tüm e-posta adresleri "@" içerir.


Yukarıdaki yöntemle ilgili küçük bir not, e-posta adreslerinde (özellikle noktalama işareti) geçerli bir grup karakterin olmasıdır.
dsolimano

@dsol: Katılıyorum. Bir e-posta adresindeki bir "+" işaretiyle kolayca fark edilebilirsiniz. Hızlı ve kirli bir çözüm için, muhtemelen arama masamda belirtmediğim noktalama işaretlerini atlarım.
csgillespie

1

Diğer mükemmel cevaplara ek olarak, bu amaç için yeterince iyi olması gereken çok basit bir karma işlevini göstermek için R dilinde basit bir örnek vereceğim. Test verileri olarak bazı e-posta adreslerini almak için, bilgisayarımda yüklü (çok fazla!) R paketinin koruyucusunun e-postalarıyla bir karakter vektörü alıyorum:

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)

Daha sonra, e-posta adresindeki her karakterden bir sayı alan, onları ekleyen, kalan modulo 4'ü hesaplayan ve 1 ekleyen basit bir işlev tanımlarım, böylece her zaman 1,2,3 veya 4 sonuçlarından birini döndürür:

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

Sonra uygulayın:

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

ve sonuçta ortaya çıkan dağılımın üniformaya yakın olduğunu gözlemleyebiliriz.


0

Her karakteri bir ascii numarasına dönüştürmeyi, taşmayı zorlamak için hepsini bir araya getirmeyi ve ardından en az önemli basamaklarda bir modül işlemi gerçekleştirmeyi deneyebilirsiniz. Bu yeterince rasgele değilse, sayıları biraz kaydırıp gerçekleştirebilirsiniz ...

-Ralph Kışları


2
Bence çarpma en iyi fikir değil. Özellikle ilk taşma normal ise - modulo 2 biraz güç. Hatta daha fazla faktör elde edersiniz, bu yüzden alt bitlerinizin çoğu 0 olacaktır. Bunun yerine sayıları bir araya getirmek zaten çok daha iyi olurdu. Daha da iyi bir rasgeleye ihtiyacınız varsa, bir çeşit karma fonksiyonu kullanın ve sonucun herhangi bir bitini kullanın. Sizden başka insanlar için sonuç hakkında bir şey tahmin etmenin zor olmasını istiyorsanız, tuzlu, güçlü bir kriptografik karma işlevi kullanın.
Erik P.

Kabul. Sadece (kabaca) sahte rasgele sayılar üretmek için bit kaymasını göstermek için fikir önermek istedim.
Ralph Winters
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.