ईमेल पते से एक अर्ध-यादृच्छिक संख्या [बंद]


10

मेरा लक्ष्य:

मुझे एक फंक्शन चाहिए जो एक ईमेल एड्रेस लेता है और 1, 2, 3 या 4 के अर्ध-यादृच्छिक संख्या को आउटपुट करता है।

थोड़ा विस्तार:

अर्ध-यादृच्छिक संख्या से मेरा मतलब है कि ईमेल पते की एक विशिष्ट आबादी को देखते हुए, 1, 2, 3, या 4 का मान प्राप्त करने की संभावनाएं लगभग बराबर हैं, और ईमेल पते के स्पष्ट व्यवस्थित गुण जैसे कि डोमेन नाम 1, 2, 3 या 4 का मान प्राप्त करने की संभावना को प्रभावित न करें।

थोड़ा पृष्ठभूमि:

मेरे पास एक ऑनलाइन प्रयोग है जो जिज्ञासु में लिखा जाता है जहां प्रतिभागी दो अवसरों पर लॉग इन करते हैं। मैं प्रतिभागियों को चार समूहों में से एक में बेतरतीब ढंग से असाइन करना चाहता हूं। हालांकि यह एक सत्र के लिए करना आसान है (मैं एक यादृच्छिक संख्या जनरेटर का उपयोग कर सकता हूं), मुझे सत्र भर में आवंटन को याद रखने के कुछ तरीके की आवश्यकता है। इस प्रकार, मुझे लगा कि मैं भागीदार ईमेल से एक अर्ध-यादृच्छिक समूह आवंटन निकाल सकता हूं। मैं उन कार्यों के सेट में भी सीमित हूं, जो मेरे निपटान में हैं ( पूरी सूची के लिए यहां देखें )। स्ट्रिंग फ़ंक्शंस हैं: टोलोवर टॉपर कैपिटलाइज़ कॉनकट सर्च रेपसीलल में स्टार्टस्विथ एंड्सविथ के साथ ट्रिम ट्रिम ट्रिमलेट लंबाई के प्रारूप का मूल्यांकन होता है।

प्रारंभिक विचार:

मैंने उस ईमेल पते की सुविधाओं के एक सेट को निकालने की कोशिश करने के बारे में सोचा जो 1, 2, 3, या 4 के मान को लौटाता है और मोटे तौर पर संभावित क्षमताओं के साथ। फिर, मैं इन संपत्तियों को जोड़ सकता हूं और उनमें से 4 प्लस 1 प्राप्त कर सकता हूं। इस प्रकार, केंद्रीय सीमा प्रमेय जैसा कुछ मानते हुए, मैं पास हो सकता हूं।

मेरे दिमाग में आने वाली संभावित विशेषताएं:

  • स्ट्रिंग की लंबाई
  • पहले "ए", "बी", आदि की स्थिति।

1
एक बहुत ही दिलचस्प समस्या। क्या आपके पास "ईमेल पतों की विशिष्ट आबादी" का एक नमूना है? इसके अतिरिक्त, यह गारंटी नहीं है, कि आगंतुकों के ईमेल-पते में एक ही दूसरी / अलग संरचना है, लेकिन जब से आप केवल एक सन्निकटन की तलाश कर रहे हैं .... दूसरा प्रश्न: क्या आप RNG का बीज सेट करने में सक्षम हैं?
स्टेफेन

6
लगता है कि आप एक 'हैश फंक्शन' चाहते हैं: en.wikipedia.org/wiki/Hash_function यह आंकड़ों के बजाय कंप्यूटर विज्ञान के दायरे में है, इसलिए मुझे यकीन नहीं है कि यह CrossValidated पर है।
OneStop

1
hmpf;) ... मेरा इरादा वही लिखने का था। @Jeromy: विशेष रूप से साइट का यह हिस्सा ( en.wikipedia.org/wiki/… ) आपके लिए दिलचस्प हो सकता है।
स्टीफन

हैशटैग के बारे में टिप के लिए @onestop धन्यवाद। इस संबंध में कि क्या प्रश्न साइट के लिए विषय पर है, मुझे लगता है कि समूहों के लिए प्रतिभागियों का यादृच्छिक आवंटन स्वाभाविक रूप से अध्ययन डिजाइन से संबंधित है, जो बदले में डेटा से इनफैक्ट से संबंधित है।
जेरोमे एंग्लीम

1
@ जेरेमी एक हैश फंक्शन हैशटैग के समान नहीं है! मैं हालांकि अध्ययन के डिजाइन के बारे में आपकी बात देखता हूं। मैं आपके पूरे प्रश्न को ठीक से नहीं पढ़ने के लिए मानता हूँ।
OneStop

जवाबों:



3

ईमेल में प्रत्येक संभावित चरित्र के लिए सिर्फ लुक-अप संख्या क्यों नहीं है। फिर एक बीज बनाने के लिए संख्याओं को समतल करें। उदाहरण के लिए,

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

तो abc @ ccc, को 12327333 में बदल दिया जाएगा। यह आपको प्रत्येक व्यक्ति के लिए एक अद्वितीय बीज देगा। फिर आप इसका उपयोग 1, 2, 3, 4 उत्पन्न करने के लिए करेंगे।


आपके प्रश्न से, ऐसा लगता है कि आपको "त्वरित और गंदे समाधान" से कोई आपत्ति नहीं है। मेरे समाधान के साथ एक समस्या यह है कि ईमेल पते यादृच्छिक नहीं हैं - उदाहरण के लिए आपको संभवतः बहुत कम ईमेल पते मिलेंगे जिनमें "z" अक्षर होते हैं, लेकिन सभी ईमेल पते "@" होते हैं।


उपरोक्त विधि के बारे में एक मामूली बात यह है कि ईमेल पते में मान्य वर्णों का एक गुच्छा है - विशेष रूप से विराम चिह्न - कि आप यह विचार करना चाहेंगे कि क्या आप ऐसा कर रहे थे।
dsolimano

@dsol: मैं सहमत हूं। आपको ईमेल पते में "+" आसानी से पकड़ा जा सकता है। एक त्वरित और गंदे समाधान के लिए, मैं शायद किसी भी विराम चिह्न को छोड़ दूंगा जिसे मैंने अपने लुक-अप तालिका में निर्दिष्ट नहीं किया था।
csgillespie

1

अन्य उत्कृष्ट उत्तरों के अतिरिक्त, मैं आर भाषा में एक बहुत ही सरल हैश फ़ंक्शन दिखाने के लिए एक सरल उदाहरण दूंगा, जो इस उद्देश्य के लिए पर्याप्त होना चाहिए। परीक्षण डेटा के रूप में कुछ ईमेल पते प्राप्त करने के लिए, मुझे अपने कंप्यूटर पर स्थापित (बहुत सारे!) आर संकुल के ईमेल के साथ एक चरित्र वेक्टर मिलता है:

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

आप प्रत्येक वर्ण को आस्की संख्या में परिवर्तित करने की कोशिश कर सकते हैं, उन सभी को एक साथ ओवरफ्लो करने के लिए गुणा कर सकते हैं, और फिर कम से कम महत्वपूर्ण अंकों पर मापांक ऑपरेशन कर सकते हैं। यदि यह छद्म यादृच्छिक रूप से पर्याप्त नहीं है, तो आप संख्याओं को थोड़ा-सा बदल सकते हैं ...

-राल्फ विंटर्स


2
मुझे लगता है कि गुणा करना सबसे अच्छा विचार नहीं है। खासकर यदि आपका प्रारंभिक अतिप्रवाह नियमित एक है - modulo 2. की कुछ शक्ति। आपको बहुत सारे कारक मिलेंगे, इसलिए आपके अधिकांश निचले बिट्स 0. होंगे। संख्याओं को एक साथ जोड़ना पहले से ही बहुत बेहतर होगा। यदि आपको और भी बेहतर यादृच्छिकता की आवश्यकता है, तो किसी प्रकार के हैश फ़ंक्शन का उपयोग करें और परिणाम के किसी भी बिट का उपयोग करें। यदि आप चाहते हैं कि आपके अलावा अन्य लोगों के लिए परिणाम के बारे में कुछ भी अनुमान लगाना मुश्किल हो, तो एक नमकीन मजबूत क्रिप्टोग्राफ़िक हैश फ़ंक्शन का उपयोग करें।
एरिक पी।

माना। बस (मोटे तौर पर) छद्म यादृच्छिक संख्या उत्पन्न करने के लिए बिट शिफ्टिंग को चित्रित करने के लिए विचार का सुझाव देना चाहता था।
राल्फ विंटर्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.