Từ một địa chỉ email đến một số bán ngẫu nhiên [đã đóng]


10

Mục tiêu của tôi:

Tôi muốn có một chức năng lấy một địa chỉ email và xuất ra một số ngẫu nhiên là 1, 2, 3 hoặc 4.

Một chi tiết nhỏ:

Theo số ngẫu nhiên, tôi có nghĩa là với một quần thể địa chỉ email điển hình, xác suất nhận được giá trị 1, 2, 3 hoặc 4 gần bằng nhau và các thuộc tính hệ thống rõ ràng của địa chỉ email như tên miền làm không ảnh hưởng đến xác suất nhận được giá trị 1, 2, 3 hoặc 4.

Một chút nền tảng:

Tôi có một thử nghiệm trực tuyến được viết bằng điều tra nơi người tham gia đăng nhập vào hai lần. Tôi muốn chỉ định ngẫu nhiên người tham gia vào một trong bốn nhóm. Mặc dù điều này dễ thực hiện trong một phiên (tôi chỉ có thể sử dụng trình tạo số ngẫu nhiên), tôi cần một số cách ghi nhớ phân bổ qua các phiên. Vì vậy, tôi nghĩ rằng tôi có thể trích xuất một phân bổ nhóm bán ngẫu nhiên từ email người tham gia. Tôi cũng bị giới hạn trong tập hợp các chức năng mà tôi có sẵn ( xem ở đây để biết danh sách đầy đủ ). Các hàm chuỗi là: tolower toupper viết hoa tìm kiếm concat concaceall chứa startwith endswith chuỗi con trim trim trim trim trimftft định dạng đánh giá

Suy nghĩ ban đầu:

Tôi đã nghĩ về việc cố gắng trích xuất một tập hợp các tính năng của địa chỉ email trả về giá trị 1, 2, 3 hoặc 4 với xác suất gần bằng nhau. Sau đó, tôi có thể tính tổng các thuộc tính này và nhận mod 4 cộng 1. Vì vậy, giả sử một cái gì đó giống như định lý giới hạn trung tâm, tôi có thể đến gần.

Các tính năng có thể xuất hiện trong tâm trí của tôi:

  • độ dài của chuỗi
  • vị trí đầu tiên "a", "b", v.v.

1
Một vấn đề rất thú vị. Bạn có sẵn một mẫu "dân số địa chỉ email" điển hình không? Ngoài ra, không đảm bảo rằng các địa chỉ email của khách truy cập có cùng cấu trúc khác / khác, nhưng vì bạn chỉ tìm kiếm một xấp xỉ .... Câu hỏi thứ hai: Bạn có thể đặt hạt giống của RNG không?
steffen

6
Âm thanh như bạn muốn có một 'hàm băm': en.wikipedia.org/wiki/Hash_feft Đây là lĩnh vực của khoa học máy tính chứ không phải là thống kê, vì vậy tôi không chắc nó thuộc về CrossValidated.
onestop

1
hmpf;) ... Tôi dự định viết như vậy. @Jeromy: Đặc biệt là phần này của trang web ( en.wikipedia.org/wiki/, ) có thể thú vị cho bạn.
steffen

@onestop Cảm ơn các mẹo về hashtags. Liên quan đến việc câu hỏi có thuộc chủ đề cho trang web hay không, tôi nghĩ rằng việc phân bổ ngẫu nhiên người tham gia vào các nhóm có liên quan đến thiết kế nghiên cứu, do đó có liên quan đến suy luận từ dữ liệu.
Jeromy Anglim

1
@Jeremy Một hàm băm hoàn toàn không giống với hashtag! Tôi thấy quan điểm của bạn về thiết kế nghiên cứu mặc dù. Tôi thừa nhận không đọc toàn bộ câu hỏi của bạn đúng cách.
onestop

Câu trả lời:



3

Tại sao không chỉ có một bảng tra cứu số cho mỗi ký tự có thể có trong email. Sau đó ghép các số để tạo thành một hạt giống. Ví dụ,

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

Vì vậy, abc @ ccc, sẽ được chuyển đổi thành 12327333. Điều này sẽ cung cấp cho bạn một hạt giống duy nhất cho mỗi người. Sau đó, bạn sẽ sử dụng điều này để tạo 1, 2, 3, 4.


Từ câu hỏi của bạn, có vẻ như bạn không bận tâm đến "giải pháp nhanh và bẩn". Một vấn đề với giải pháp của tôi là địa chỉ email không ngẫu nhiên - ví dụ: bạn có thể sẽ nhận được rất ít địa chỉ email có chứa chữ "z", nhưng tất cả các địa chỉ email đều chứa "@".


Một lưu ý nhỏ về phương pháp trên là có một loạt các ký tự hợp lệ trong địa chỉ email - đặc biệt là dấu chấm câu - mà bạn muốn xem xét nếu bạn đang làm điều này.
DSolimano

@dsol: Tôi đồng ý. Bạn có thể dễ dàng bị bắt gặp với dấu "+" trong địa chỉ email. Đối với một giải pháp nhanh và bẩn, có lẽ tôi sẽ bỏ qua bất kỳ ký tự dấu chấm câu nào mà tôi đã không chỉ định trong bảng tra cứu của mình.
csgillespie

1

Ngoài các câu trả lời xuất sắc khác, tôi sẽ chỉ đưa ra một ví dụ đơn giản trong ngôn ngữ R để hiển thị hàm băm rất đơn giản, đủ tốt cho mục đích này. Để lấy một số địa chỉ email làm dữ liệu thử nghiệm, tôi lấy một vectơ ký tự với email của những người duy trì các gói R (quá nhiều!) Được cài đặt trên máy tính của tôi:

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)

Sau đó, tôi xác định một hàm đơn giản lấy một số từ mỗi ký tự trong địa chỉ email, thêm chúng, tính toán modulo 4 còn lại và thêm 1, để nó luôn trả về một trong các kết quả 1,2,3 hoặc 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

Sau đó áp dụng nó:

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

và chúng ta có thể quan sát rằng phân phối kết quả gần với thống nhất.


0

Bạn có thể thử chuyển đổi từng ký tự thành số ascii, nhân tất cả chúng lại với nhau để buộc tràn, và sau đó thực hiện thao tác mô đun trên các chữ số có nghĩa ít nhất. Nếu điều này không đủ giả ngẫu nhiên, bạn có thể thực hiện thay đổi bit một chút ...

Mùa đông -Ralph


2
Nhân lên không phải là ý tưởng tốt nhất, tôi nghĩ. Đặc biệt nếu tràn ban đầu của bạn là mức thông thường - modulo có sức mạnh bằng 2. Bạn sẽ nhận được rất nhiều yếu tố là số chẵn, vì vậy hầu hết các bit thấp hơn của bạn sẽ là 0. Thay vào đó, việc cộng các số lại với nhau sẽ tốt hơn rất nhiều. Nếu bạn cần sự ngẫu nhiên tốt hơn nữa, hãy sử dụng một số loại hàm băm và sử dụng bất kỳ bit nào của kết quả. Nếu bạn muốn khó đoán bất cứ điều gì về kết quả cho những người khác ngoài bạn, hãy sử dụng hàm băm mật mã mạnh.
Erik P.

Đã đồng ý. Chỉ muốn đề xuất ý tưởng để minh họa sự dịch chuyển bit để tạo ra các số giả ngẫu nhiên (đại khái).
Ralph Winters
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.