2010-10-19 36 views
11

tôi có thể tạo ra số ngẫu nhiên giữa hai con số trong c sử dụng này ..Tạo số ngẫu nhiên giữa hai số với một số hiếm

arc4random()%(high-low+1)+low; 

sau đó bây giờ yêu cầu của tôi là ... tôi muốn thực hiện một số hiếm. ... thats có nghĩa là nếu

cao = 5, thấp = 1, hiếm = 3,

hơn 3 sẽ được xuất hiện nhiều hơn hiếm khi 1,2,4 và 5 ...

Cảm ơn

tùy chọn
+9

Tôi đặt cược anh chàng này làm việc cho một sòng bạc trực tuyến :) – Joony

+0

nop ... tôi làm việc cho phù hợp với 3 câu đố .. – Rony

+1

Bạn cũng có thể quan tâm đến gamedev.stackexchange.com :) – badp

Trả lời

26

Bạn có thể sử dụng bảng để tính toán cuộn cuối cùng của bạn, tương tự như cách bút và game nhập vai giấy làm kiểu này cùng tính:

cuộn 1 D 21 (một cách dễ dàng có thể w/code).

  • Nếu bạn nhận được 1-5, thì coi như là 1
  • Nếu bạn nhận được 610, thì coi như là 2
  • Nếu bạn nhận được 11-15, thì coi như là 4
  • Nếu bạn nhận được 16-20, thì coi như là 5
  • Nếu bạn nhận được một 21, thì coi như là 3

Ưu điểm để tùy chọn này là bạn sẽ có được một cảm giác mạnh mẽ của các xác suất chính xác mà bạn đang xử lý. Bạn có thể có được cảm giác về chính xác số lượng hiếm hoặc phổ biến của mỗi số và bạn có được quyền kiểm soát chi tiết về mức độ phổ biến của mỗi số, so với các số khác.

Bạn cũng có thể sử dụng phân số để tạo bảng. Sử dụng số Least Common Multiple để xác định cơ sở chung. Cơ sở đó là kích thước số ngẫu nhiên tối đa bạn sẽ cần. Sau đó, đặt tất cả các phân số theo các thuật ngữ như vậy. Sử dụng các tử số kết quả để xác định kích thước của phạm vi cho mỗi số trong bảng.

Với giải pháp tự động này, số đầu vào rất dễ hiểu liên quan đến nhau. E.g:

  • 1/4 cho 1
  • 1/4 cho 2
  • 1/4 cho 4
  • 1/5 cho 5
  • 1/20 cho 3

Điều này sẽ tạo ra một bảng như vậy:

LCM = 20

  • 1-5 = 1 (như thuật ngữ - 5/20)
  • 6-10 = 2 (5/20)
  • 11-15 = 4 (5/20)
  • 16-19 = 5 (4/20)
  • 20 = (1/20)

một số chi tiết trên LCM: http://en.wikipedia.org/wiki/Least_common_multiple

11

Một hiểu-đơn giản để-:

  • Tạo một số để xác định xem bạn đang đi để trả lại số hiếm (ví dụ tạo một số trong phạm vi [0-99] và nếu là 0, hãy trả về số hiếm
  • Nếu bạn thực hiện bước này, bạn sẽ trả về một số không hiếm: tiếp tục tạo số trong phạm vi bình thường cho đến khi bạn nhận được bất kỳ số không hiếm nào và trả lại số

Có các cách tiếp cận thay thế khác chỉ yêu cầu bạn tạo một số, nhưng ở trên có vẻ như đây là cách đơn giản nhất để viết và hiểu.

+4

Bạn không cần để liên tục tạo số trong bước thứ hai, chỉ cần giảm phạm vi một và nếu số ngẫu nhiên> = số hiếm, hãy tăng số đó. – Skizz

+0

@Skizz: Bạn chắc chắn * có thể * làm điều đó, vâng. Nó sẽ hiệu quả hơn. Tôi nghĩ rằng nó sẽ đòi hỏi nhiều chu kỳ não hơn là chỉ lặp lại - ít nhất là đối với tôi - nhưng nó vẫn là một ý tưởng hay. –

5

Bạn có thể tạo một mảng chứa các số theo khả năng của họ:

list = (1, 1, 2, 2, 3, 4, 4, 5, 5); 
return list.itemAtIndex(random() % list.count()); 

Đây không phải là rất thanh lịch, nhưng nó hoạt động và dễ dàng cân nên xác suất trở nên phức tạp hơn.

+0

+1; Đây là một cách để thực hiện giải pháp của tôi ở trên, nếu lưu trữ kết thúc ở mức thấp, không phải là mối quan tâm, hoặc là một sự cân bằng tốt so với thời gian của CPU –

0
while true 
    generate a random number 
     if it's not the rare number, return it 
    generate a second random number - say from 1 to 100 
    if that second number's <= the percentage chance of the rare number compared to the others, return the rare number 

Lưu ý: điều này là nhanh đối với trường hợp thông thường hoặc trả về số không hiếm.

1

Tổng của tất cả các xác suất phải là 1. Bây giờ chúng tôi đang làm việc ở đây với xác suất riêng biệt trong phạm vi hữu hạn nên chúng tôi đang xem xét (ở đây) 5 khả năng với một số phân phối bạn có, gọi chúng là p1, p2, p3, p4 và P5 tổng số đó là 1.

f0 = 0 f1 = P1 f2 = f1 + p2 f3 = f2 + p3 f4 = f3 + p4 f5 = f4 + p5 và phải 1

Tạo một số ngẫu nhiên từ 0 đến 1 và chúng tôi giả định rằng nó không thể chính xác 1. Nhìn vào giá trị f vừa với trần của nó và đó là giá trị của sự kiện ngẫu nhiên của bạn. Vì vậy, có lẽ

f1 = 0,222 f2 = 0,444 f3 = 0,555 f4 = 0,777 f5 = 1

Nếu số ngẫu nhiên của bạn được 0,645 thì bạn đã tạo ra một sự kiện 4. Với những điều trên, bạn có một nửa cơ hội tạo ra hơn 3 người so với bất kỳ người nào khác. Chúng ta có thể làm cho nó ít có khả năng vẫn còn, ví dụ:

f1 = 0.24 f2 = 0,48 f3 = 0,52 f4 = 0,76 f5 = 1

0.24 lẽ của những người khác và chỉ 0,04 của một 3.

+0

Giải pháp này có vẻ đầy hứa hẹn, nhưng lời giải thích của bạn gây nhầm lẫn. Bạn có thể giải thích cách bạn xác định giá trị nào được chọn không? Lý do tôi thích câu trả lời này là bạn giảm thiểu các tính toán liên quan (các giá trị ngẫu nhiên luôn được tạo ra giữa 0.0 và 1.0), và bạn chỉ yêu cầu một giá trị được lưu trữ cho mỗi loại kết quả. –

+0

Đây là thanh lịch, nhưng yêu cầu tăng gấp đôi và tìm kiếm nhị phân thông qua tập hợp các giá trị cắt. Không phải là kết thúc của thế giới, nhưng xem xét hiệu suất. Mặc dù vậy, đôi khi là tốt theo cách khác - dễ dàng hơn để thiết lập và hiểu hơn nhiều tính toán phổ biến trong cách tiếp cận của Merlyn. –

+0

Có thể sẽ tương đối chậm, cách nhanh hơn là tạo bảng tĩnh. Có lẽ chúng ta có 256 giá trị trong bảng tĩnh, mỗi giá trị chứa một số từ 1 đến 5, và bạn chọn một số ngẫu nhiên từ 0 đến 255 rồi tra cứu trong bảng giá trị nó liên quan đến cái gì. – CashCow

1

Hãy thực hiện điều này. Đầu tiên chúng ta sử dụng hàm srand() để tạo hạt giống ngẫu nhiên. Về cơ bản, máy tính có thể tạo ra các số ngẫu nhiên dựa trên số được đưa vào srand().Nếu bạn đưa ra giá trị giống nhau, thì các số ngẫu nhiên giống nhau sẽ được tạo ra mỗi lần.

Vì vậy, chúng tôi phải tạo hạt giống ngẫu nhiên với giá trị luôn thay đổi. Chúng ta làm điều này bằng cách cho nó giá trị của thời gian hiện tại với hàm time().

Bây giờ, khi chúng tôi gọi rand(), một số ngẫu nhiên mới sẽ được tạo ra mỗi lần.

#include<stdio.h> 
int random_number(int min_num, int max_num); 

int main(void) { 
    printf("Min : 1 Max : 30 %d\n",random_number(0,5)); 
    printf("Min : 100 Max : 1000 %d\n",random_number(100,1000)); 
    return 0; 
} 

int random_number(int min_num, int max_num) 
{ 
    int result=0,low_num=0,hi_num=0; 
    if(min_num<max_num) 
    { 
     low_num=min_num; 
     hi_num=max_num+1; // this is done to include max_num in output. 
    }else{ 
     low_num=max_num+1;// this is done to include max_num in output. 
     hi_num=min_num; 
    } 

    srand(time(NULL)); 
    result = (rand()%(hi_num-low_num))+low_num; 
    return result; 
} 
Các vấn đề liên quan