2015-07-08 19 views
6

Tôi cần viết một chuỗi tạo chuỗi ngẫu nhiên tạo chuỗi 7char từ bộ ký tự 31-char và một số chữ cái (10 + 26-5, 5 nguyên âm bị bỏ qua). toán học đơn giản cung cấp cho một tập hợp của 31^7 kết hợp có thể ~ 27,5 tỷ đồng. tôi có câu hỏi liên quan đến nghịch lý bday, tôi chạy một số thử nghiệm và số lượng các bản sao tăng theo cấp số nhân. tôi có thể làm gì để tránh điều này không?Tạo chuỗi ngẫu nhiên java và nghịch lý sinh nhật

At 1 million, duplicates encountered till now = 19 
At 2 million, duplicates encountered till now = 69 
At 3 million, duplicates encountered till now = 157 
At 4 million, duplicates encountered till now = 280 
At 5 million, duplicates encountered till now = 470 
At 6 million, duplicates encountered till now = 662 
At 7 million, duplicates encountered till now = 896 
At 8 million, duplicates encountered till now = 1185 
At 9 million, duplicates encountered till now = 1500 
At 10 million, duplicates encountered till now = 1823 
At 11 million, duplicates encountered till now = 2204 
At 12 million, duplicates encountered till now = 2584 
At 13 million, duplicates encountered till now = 3020 
At 14 million, duplicates encountered till now = 3527 
At 15 million, duplicates encountered till now = 4110 
At 16 million, duplicates encountered till now = 4683 
At 17 million, duplicates encountered till now = 5284 
At 18 million, duplicates encountered till now = 5919 
At 19 million, duplicates encountered till now = 6611 
At 20 million, duplicates encountered till now = 7343 
At 21 million, duplicates encountered till now = 8095 
At 22 million, duplicates encountered till now = 8858 
At 23 million, duplicates encountered till now = 9707 
At 24 million, duplicates encountered till now = 10547 
At 25 million, duplicates encountered till now = 11452 
At 26 million, duplicates encountered till now = 12399 
At 27 million, duplicates encountered till now = 13356 
At 28 million, duplicates encountered till now = 14393 
At 29 million, duplicates encountered till now = 15369 
At 30 million, duplicates encountered till now = 16436 

Dưới đây là các lớp thử nghiệm:

import java.util.Set; 

import org.apache.commons.lang3.RandomStringUtils; 

import com.google.common.collect.Sets; 

public class RandomUnivmylocaL { 

    public static void main(String[] argv) { 

     final int million = 1_000_000; 

     final int iterations = 30; 
     // 31 chars 
     final char[] charArr = new char[] { '1', '2', '3', '4', '5', '6', '7', 
       '8', '9', '0', 'B', 'C', 'D', 'F', 'G', 'H', 'J', 'K', 'L', 
       'M', 'N', 'P', 'Q', 'R', 'S', 'T', 'V', 'W', 'X', 'Y', 'Z' }; 
     // System.out.println(charArr.length); 

     final Set<String> set = Sets.newHashSetWithExpectedSize(
       iterations * million); 

     for (int i = 0; i < iterations; i++) { 
      for (int j = 0; j < million; j++) { 
       final String univCode = RandomStringUtils.random(7, charArr); 
       set.add(univCode); 
      } 
      System.out.println("At " + (i + 1) + " million, " + 
        "duplicates encountered till now = " + 
        (((i + 1) * million) - set.size())); 
     } 
     System.out.println("done"); 
    } 
} 

Trả lời

1

Đây là nghịch lý ngày sinh nhật.

sqrt (27.5bn) = 165831, công thức nghịch lý sinh nhật cho M lớn là 1.177 * sqrt (M), vì vậy khi bạn tạo khoảng 200.000 thì sẽ có 50/50 cơ hội gặp sự cố, khi bạn nhận được đến một triệu bạn sẽ có khoảng 18 vấn đề, v.v.

Vấn đề sinh nhật - bao nhiêu cho đến khi có khả năng bạn sẽ bị va chạm - khoảng 200.000. http://www.wolframalpha.com/input/?i=n%3D200000,+m%3D(31%5E7),+n+-+m(1+-+((m-1)%2Fm)%5En)

Đặt n = 23,0 và m = 365 để xem 23 người trong một phòng tương đương. http://www.wolframalpha.com/input/?i=n%3D23.0,+m%3D365,+n+-+m(1+-+((m-1)%2Fm)%5En)

Bạn có thể xem mô phỏng của bạn gần như thế nào với câu trả lời mong đợi cho số lượng lớn.

http://www.wolframalpha.com/input/?i=n%3D30e6,+m%3D(31%5E7),+n+-+m(1+-+((m-1)%2Fm)%5En)

Bài viết của Quora rất tốt. http://www.quora.com/How-can-I-calculate-the-expected-number-of-cache-hits.

Vì vậy, bạn cần tăng số ký tự được phép hoặc sử dụng chuỗi dài hơn. HOẶC - để sử dụng 7 chữ số, chỉ cần tăng bộ đếm. HOẶC sử dụng ngẫu nhiên, và kiểm tra xem bạn đã sử dụng nó trước đây chưa, và đặt lại khi bạn cảm thấy mệt mỏi khi tìm kiếm số mới.

Ngoài ra còn có các trình tạo giả ngẫu nhiên có thể bao trùm không gian mà không cần phải truy cập lại. 7 ký tự sẽ không làm cho giải pháp của bạn an toàn.

Các vấn đề liên quan