2010-12-30 33 views
5

Tôi có cơ sở dữ liệu phim nơi tôi cần điền dữ liệu để dễ dàng kiểm tra và phát triển ứng dụng hơn. Có các bảng để giữ xếp hạng phim và tài khoản người dùng, người dùng xếp hạng phim.Làm cách nào để phân ngẫu nhiên các giá trị từ 1 đến 10 cho xếp hạng thực tế?

Tôi đã bắt đầu phát triển tập lệnh để điền dữ liệu giả và dữ liệu chung nhưng tôi không biết cách ngẫu nhiên xếp hạng. Đối với mỗi bộ phim, tôi chọn một số lượng người dùng ngẫu nhiên, 100, 500, 1000, bất cứ điều gì. Và đối với mỗi người dùng, tôi ngẫu nhiên xếp hạng từ 1 đến 10. Nhưng những xếp hạng này có cùng mức trung bình khoảng 5. Điều này có nghĩa là phân phối xếp hạng (1 đến 10) cho một bộ phim cụ thể về cơ bản giống nhau. Đây không phải là "thực tế" vì tất cả các phim có xếp hạng được tạo như thế này sẽ có cùng mức trung bình, do đó, cùng một xếp hạng từ những người dùng khác nhau và số lượng người dùng khác nhau, không thực sự quan trọng.

Tôi muốn phim A có mức trung bình là 7, trung bình phim B là 5, phim trung bình là 8, v.v ... Nhưng tôi không muốn mức trung bình khác nhau cho mỗi bộ phim. Ý tôi là, nó sẽ được tốt đẹp để sản xuất xếp hạng như thế này (đối với một số cụ thể của người sử dụng): http://www.imdb.com/title/tt1046173/ratings hay này http://www.imdb.com/title/tt0486640/ratings

Bạn biết đấy, một cái gì đó ngẫu nhiên mà có thể tạo ra hai biến thể khác nhau như những người ở trên. Tôi nhấn làm mới và tôi nhận được đồ thị đầu tiên, tôi nhấn làm mới và nhận được thứ hai, nhấn một lần nữa và nhận được một cái gì đó khác nhau hoặc tương tự, một cái gì đó "ngẫu nhiên" và "thực tế".

Tôi cũng sẽ hiển thị các biểu đồ như thế này trên ứng dụng của mình để trông sẽ đẹp hơn khi có các bản phân phối khác nhau. Nhưng tôi không có ý tưởng làm thế nào tôi có thể ngẫu nhiên thực hiện điều này với một kịch bản đơn giản để tạo ra tất cả những điều đó.

Tôi làm cách nào để giải quyết vấn đề này? Có lẽ nó quá nhiều công việc không có giá trị nó?

Có thể một cái gì đó đơn giản hơn, như chọn một điểm (từ 1 đến 10) và sau đó tạo phân phối bình thường các xếp hạng mà điểm được chọn là điểm cao nhất.

+0

không hoàn toàn hiểu câu hỏi của bạn ... bạn có muốn chọn ngẫu nhiên biểu đồ xếp hạng từ danh sách phim hiện có không? – ajreal

+0

Không, tôi muốn phân ngẫu nhiên các xếp hạng trông giống như các biểu đồ ở trên để tôi có thể chèn chúng vào cơ sở dữ liệu và có một số dữ liệu để làm việc. –

+1

echo '9'; // Bạn không thể chứng minh nó không ngẫu nhiên –

Trả lời

4

Bạn muốn sửa giá trị trung bình và có thể là phương sai và tạo số ngẫu nhiên xung quanh các giá trị đó.

Điều này sẽ giúp bạn bắt đầu: Generating random numbers with known mean and variance

Edit: Trên thực tế, nếu bạn nghĩ về nó điều này có thể được giải quyết một cách dễ dàng: lý do con số của bạn có xu hướng hướng tới 5, là bởi vì quy mô của bạn là giữa 1 và 10 (trung bình là 5).

Chỉ cần lấy số ngẫu nhiên của bạn, thêm 8 cho tất cả chúng và làm tròn bất kỳ số nào lớn hơn 10 xuống 10 và bạn sẽ nhận được thứ gì đó xoay quanh 8-ish (nhưng nghiêng ở trên). Có lẽ đủ tốt cho mục đích của bạn?

+0

Tôi không nghĩ vậy. Các con số có xu hướng hướng tới 5 khiến các số được tạo ngẫu nhiên là thống nhất, xác suất tạo một số giống hệt nhau đối với mọi số khác.Thêm 8 cho tất cả chúng và làm tròn số lớn hơn 10 xuống 10 sẽ cho tôi một cái gì đó hơi khác nhau nhưng mỗi đánh giá sẽ có số lượng phiếu bầu tương tự. –

0

Adive của tôi là yo liên quan đến thời gian trong việc tạo số randon, cũng sử dụng các hàm như mt_rand để cải thiện việc tạo ngẫu nhiên. Hãy thử làm một số op float phức tạp và đúc thành int và cuối cùng áp dụng một% max_value để kết quả đó phù hợp với giới hạn của bạn.

Ví dụ:

function x() 
{ 
return (time() * 7.3333333333 * mt_rand(0.1 , 10.1)); 
} 

$rank = (x() + 3.99999) % 10); 

Tôi không nói rằng công trình này nhưng ilustrates ý tưởng. Hy vọng nó giúp!

3

Hãy nhớ rằng với RNG chuẩn (trình tạo số ngẫu nhiên), bạn sẽ nhận được phân phối rất giá trị. Với đủ giá trị 'ngẫu nhiên', bạn sẽ nhận được kết quả trung bình, như bạn đã khám phá.Đối với dân số trong cơ sở dữ liệu của bạn, tôi sẽ xem xét phương pháp này:

Chọn một số ngẫu nhiên sẽ đóng vai trò là điểm trung bình cho phim. Sau đó, tạo một tập hợp các số ngẫu nhiên trong giới hạn trên của mức trung bình đó. Ví dụ, nếu bạn tạo ngẫu nhiên một số 7, tạo ra các số ngẫu nhiên từ 5 đến 9. Sau đó, ném vào một vài giá trị từ 1 đến 6 và 8 đến 10 để cung cấp sự xuất hiện của các ngoại lệ.

EDIT:

answer Đây có thể là những gì bạn đang tìm kiếm, hoàn chỉnh với mã trong Java.

Ngay cả phân phối Ví dụ:

Mã của bạn có khả năng tương tự như sau:

public class EvenDistribution 
{ 
    private static Random random = new Random(); 

    public static void main(String[] args) 
    { 
     int maxValue = 20; 

     int[] distribution = new int[maxValue]; 

     int iterations = 1000; 

     for (int i = 0; i < iterations; i++) 
     { 
      int rand = random.nextInt(maxValue); 
      distribution[rand]++; 
     } 

     for (int i = 0; i < distribution.length; i++) 
     { 
      System.out.println(i+1+": "+distribution[i]); 
     } 
    } 
} 

Lớp này có kết quả như sau:

1: 47
2: 45
3 : 59
4: 5: 54
6: 52
7: 49
8: 49
9: 49
10: 48
11: 12: 43
13: 42
14: 15: 43
16: 55
17: 18: 55
19 : 64
20:

Phân phối này rất đồng đều. 19 có vẻ hơi bất thường, nhưng nhìn chung chúng ta có thể nói rằng phương pháp RNG này tạo ra các kết quả dự đoán được.

Sử dụng thư viện Toán học không phổ biến được đề cập ở trên, tôi đã sử dụng mã tương tự, sử dụng GaussianGenerator.

public class RandomDistribution { 
    private static MersenneTwisterRNG random = new MersenneTwisterRNG(); 
    private static GaussianGenerator gen = new GaussianGenerator(7, 3, random); 

    public static void main(String[] args) 
    { 
     int maxValue = 20; 

     int[] distribution = new int[maxValue]; 

     int iterations = 1000; 

     for (int i = 0; i < iterations; i++) 
     { 
      int rand = Math.abs(gen.nextValue().intValue()); 
      distribution[rand]++; 
     } 

     for (int i = 0; i < distribution.length; i++) 
     { 
      System.out.println(i+1+": "+distribution[i]); 
     } 
    } 
} 

Nó được sản xuất đầu ra sau đây:

1: 19
2: 27
3: 41
4: 68
5: 110
6: 111
7: 125
8: 138
9: 125
10: 85
11: 64
12: 32
13: 32
14: 14
15: 5
16: 2
17: 1
18: 0
19: 1
20: 0

Dường như thư viện này sẽ rất tốt cho những gì bạn đang cố gắng hoàn thành.

+0

Vì vậy, tôi chỉ cần một cái gì đó như thế nhưng đối với PHP. GaussionGenerator có lẽ là những gì tôi đang tìm kiếm. –

+0

@Nazgulled: Các Uncommons toán học là Phần mềm nguồn mở, vì vậy bạn có thể điều chỉnh mã họ sử dụng cho GausianGenerator thành PHP. –

0

Như ngụ ý bởi Kenny, bạn muốn nhìn vào một Phân phối bình thường. Nếu bạn nhìn vào các xếp hạng trên IMDB, bạn sẽ hầu hết các bộ phim theo một phân phối bình thường. Các ngoại lệ là thứ hạng trên cùng và dưới cùng. Rất nhiều người sẽ nói rằng họ ghét hoặc yêu một bộ phim - họ phóng đại cảm giác thật của họ, do đó những cú sốc này. Vì vậy, đối với một bộ chính xác của dữ liệu, bạn sẽ cần phải thêm các in. Có lẽ để xếp hạng thấp nhất = (tổng của hai thấp nhất tiếp theo) * một hằng số?

+0

Tôi không cần dữ liệu thực sự chính xác, tôi chỉ không muốn tất cả các phim có phân phối tương tự (chỉ dành cho mục đích thử nghiệm), tập trung vào cùng một giá trị. Tôi sẽ xem xét phân phối bình thường với PHP sau đó. –

0

Tôi cũng hỗ trợ lời khuyên của Kenny nhưng muốn thêm ghi chú khi triển khai. Mặc dù đây không phải là cách tiếp cận tốt nhất tôi đã nhìn thấy nó được thực hiện một vài lần do nó dễ dàng.

Hãy tưởng tượng một mảng mười phần tử dài mỗi phần tử chứa giá trị 10. Nếu bạn tạo một số ngẫu nhiên từ 1 đến 100, bạn có thể đếm vào mảng tổng mỗi phần tử tiến tới chỉ mục tiếp theo trong mảng nếu giá trị lớn hơn tổng các giá trị của mảng đến thời điểm này. Bằng cách này bạn có thể lập bản đồ 1-100 đến 1-10.

Mặc dù ở trên sẽ là một cách sử dụng khủng khiếp của kỹ thuật này bạn có thể dễ dàng thấy cách bạn có thể tạo ra một bản phân phối không đồng đều của riêng bạn. Ví dụ xem xét:

1,2,4,8,16,16,8,4,2,1

10 yếu tố trên tổng 64 và vì vậy sẽ rất thích hợp để lập bản đồ 64-10 (Đây chỉ là một minh họa). Các triển khai mà tôi đã thấy muốn có phân phối luôn tổng hợp cho một số cụ thể, nhưng nếu bạn đóng gói lấy một số ngẫu nhiên từ 1-10 thì bạn có thể có các bản phân phối tổng hợp khác nhau. Chỉ cần tạo một vài bản phân phối như vậy, bạn có thể tạo ra nhiều bản phân phối hợp lý bằng cách tổng hợp các vector xác suất (xem xét phân bố rất cục bộ xung quanh 3 và phân phối nội địa hóa cao khoảng 8, có lẽ đó là slasher zombie mới nhất và những người yêu thích zombie tất cả bỏ phiếu 8 vì phim zombie đi khá hay và phần còn lại của bộ phim được công chúng bình chọn là 3 vì ... nói chung nó ít hút hơn).

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