จากที่อยู่อีเมลไปยังหมายเลขกึ่งสุ่ม [ปิด]


10

จุดมุ่งหมายของฉัน:

ฉันต้องการที่จะมีฟังก์ชั่นที่ใช้ที่อยู่อีเมลและส่งออกจำนวนกึ่งสุ่มแบบ 1, 2, 3 หรือ 4

รายละเอียดเล็กน้อย:

จากตัวเลขสุ่มฉันหมายถึงการให้ประชากรโดยทั่วไปของที่อยู่อีเมลความน่าจะเป็นที่จะได้รับค่า 1, 2, 3 หรือ 4 มีค่าเท่ากันโดยประมาณและคุณสมบัติระบบที่ชัดเจนของที่อยู่อีเมลเช่นชื่อโดเมน ไม่ส่งผลกระทบต่อความน่าจะเป็นในการรับค่า 1, 2, 3 หรือ 4

พื้นหลังเล็กน้อย:

ฉันมีการทดสอบออนไลน์ที่เขียนขึ้นโดยการสอบสวนที่ผู้เข้าร่วมลงชื่อเข้าใช้สองครั้ง ฉันต้องการสุ่มมอบหมายให้ผู้เข้าร่วมหนึ่งในสี่กลุ่ม ขณะนี้ทำได้ง่ายสำหรับหนึ่งเซสชัน (ฉันสามารถใช้ตัวสร้างตัวเลขสุ่ม) ได้ฉันต้องการวิธีการจดจำการจัดสรรข้ามเซสชัน ดังนั้นฉันคิดว่าฉันสามารถแยกการจัดสรรกลุ่มแบบกึ่งสุ่มจากอีเมลของผู้เข้าร่วมได้ ฉันยังมีข้อ จำกัด ในชุดฟังก์ชั่นที่ฉันมีให้ด้วย ( ดูที่นี่เพื่อดูรายการทั้งหมด ) ฟังก์ชั่นสตริงคือ: tolower toupper ประโยชน์ของการค้นหา concat concall มี startswith endswith substring trim trim trimright trimleft ประเมินรูปแบบ

ความคิดเริ่มต้น:

ฉันคิดถึงการพยายามแยกชุดคุณลักษณะของที่อยู่อีเมลที่ส่งคืนค่า 1, 2, 3 หรือ 4 ด้วยความน่าจะเป็นที่เท่าเทียมกัน จากนั้นฉันสามารถรวมคุณสมบัติเหล่านี้และรับ mod 4 บวก 1 จากนั้น ดังนั้นถ้าสมมุติว่าทฤษฎีบทขีด จำกัด กลางฉันอาจเข้าใกล้

คุณสมบัติที่เป็นไปได้ที่อยู่ในใจของฉัน:

  • ความยาวของสตริง
  • ตำแหน่งแรกของ "a", "b" ฯลฯ

1
ปัญหาที่น่าสนใจมาก คุณมีตัวอย่างของ "ประชากรทั่วไปของที่อยู่อีเมล" ในมือหรือไม่ นอกจากนี้ไม่รับประกันว่าที่อยู่อีเมลของผู้เข้าชมจะมีโครงสร้างอื่น / แตกต่างกัน แต่เนื่องจากคุณเพียงมองหาการประมาณ .... คำถามที่สอง: คุณสามารถตั้งค่าเมล็ดพันธุ์ของ RNG ได้หรือไม่?
steffen

6
ดูเหมือนว่าคุณต้องการ 'ฟังก์ชั่นแฮช': en.wikipedia.org/wiki/Hash_function นี่คือขอบเขตของวิทยาศาสตร์คอมพิวเตอร์มากกว่าที่จะเป็นสถิติ แต่ฉันไม่แน่ใจว่ามันเป็นของ CrossValidated
onestop

1
hmpf;) ... ฉันตั้งใจจะเขียนเหมือนกัน @Jeromy: โดยเฉพาะส่วนนี้ของเว็บไซต์ ( en.wikipedia.org/wiki/ ...... ) อาจจะน่าสนใจสำหรับคุณ
steffen

@onestop ขอบคุณสำหรับเคล็ดลับเกี่ยวกับแฮชแท็ก ในส่วนที่เกี่ยวกับคำถามที่อยู่ในหัวข้อสำหรับเว็บไซต์ฉันคิดว่าการจัดสรรแบบสุ่มของผู้เข้าร่วมไปยังกลุ่มนั้นเกี่ยวข้องกับการออกแบบการศึกษาโดยกำเนิดซึ่งเกี่ยวข้องกับการอนุมานจากข้อมูล
Jeromy Anglim

1
@Jeremy ฟังก์ชั่นแฮชไม่เหมือนกับ hashtag เลย! ฉันเห็นประเด็นของคุณเกี่ยวกับการออกแบบการเรียน ฉันยอมรับว่าไม่ได้อ่านคำถามทั้งหมดของคุณอย่างถูกต้อง
onestop

คำตอบ:



3

ทำไมไม่เพียงแค่มีตารางตัวเลขค้นหาสำหรับตัวละครที่เป็นไปได้ในอีเมล จากนั้นต่อตัวเลขให้เป็นรูปเมล็ด ตัวอย่างเช่น,

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

ดังนั้น abc @ ccc จะถูกแปลงเป็น 12327333 ซึ่งจะให้เมล็ดที่ไม่ซ้ำกันสำหรับแต่ละคน จากนั้นคุณจะใช้สิ่งนี้เพื่อสร้าง 1, 2, 3, 4


จากคำถามของคุณดูเหมือนว่าคุณจะไม่สนใจ "ทางออกที่รวดเร็วและสกปรก" ปัญหาอย่างหนึ่งของการแก้ปัญหาของฉันคือที่อยู่อีเมลไม่สุ่ม - ตัวอย่างเช่นคุณอาจได้รับที่อยู่อีเมลน้อยมากที่มีตัวอักษร "z" แต่ที่อยู่อีเมลทั้งหมดมี "@"


ข้อควรทราบเล็กน้อยเกี่ยวกับวิธีการด้านบนคือมีอักขระที่ถูกต้องจำนวนหนึ่งในที่อยู่อีเมลโดยเฉพาะเครื่องหมายวรรคตอนโดยเฉพาะอย่างยิ่งที่คุณต้องการพิจารณาหากคุณทำสิ่งนี้
dsolimano

@dsol: ฉันเห็นด้วย คุณสามารถใช้เครื่องหมาย "+" ในที่อยู่อีเมลได้อย่างง่ายดาย สำหรับวิธีแก้ปัญหาที่รวดเร็วและสกปรกฉันอาจจะข้ามอักขระเครื่องหมายวรรคตอนที่ฉันไม่ได้ระบุในตารางค้นหาของฉัน
csgillespie

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 คูณพวกมันทั้งหมดเข้าด้วยกันเพื่อบังคับให้เกิดการล้นและจากนั้นดำเนินการโมดูลัสกับตัวเลขที่สำคัญน้อยที่สุด หากนี่ไม่สุ่มหลอกพอคุณสามารถทำการเปลี่ยนตัวเลขเป็นบิต ...

-Ralph Winters


2
ฉันคิดว่าการทวีคูณไม่ใช่ความคิดที่ดีที่สุด โดยเฉพาะอย่างยิ่งหากการโอเวอร์โฟลว์เริ่มต้นของคุณเป็นแบบปกติ - โมดูโลบางกำลัง 2 คุณจะได้รับปัจจัยจำนวนมากแม้กระทั่งบิตที่ต่ำกว่าของคุณส่วนใหญ่จะเป็น 0 การเพิ่มตัวเลขเข้าด้วยกันแทนจะดีกว่ามาก หากคุณต้องการการสุ่มที่ดียิ่งขึ้นให้ใช้ฟังก์ชั่นแฮชและใช้บิตของผลลัพธ์ หากคุณต้องการให้เดาได้ยากเกี่ยวกับผลลัพธ์สำหรับคนอื่น ๆ ที่ไม่ใช่คุณให้ใช้ฟังก์ชันแฮชการเข้ารหัสลับแบบเค็ม
Erik P.

ตกลง เพียงแค่ต้องการแนะนำแนวคิดเพื่อแสดงการขยับบิตเพื่อสร้าง (โดยประมาณ) ตัวเลขหลอกแบบสุ่ม
Ralph Winters
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.