Генерация случайного числа между двумя числами с одним редким числом - PullRequest
11 голосов
/ 19 октября 2010

я могу сгенерировать случайное число между двумя числами в c, используя это ..

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

, тогда мое требование ... я хочу сделать число редким .... это значит, если

high = 5, low = 1 и редко = 3,

чем 3 будут появляться намного реже, чем 1,2,4 и 5 ...

Спасибо

Ответы [ 6 ]

26 голосов
/ 19 октября 2010

Вы можете использовать таблицы для расчета вашего окончательного броска, аналогично тому, как ручные и бумажные РПГ выполняют такие же расчеты:

Рулон 1 D 21 (легко возможно с кодом).

  • Если вы получаете 1-5, он считается как 1
  • Если вы получаете 6-10, он считается как 2
  • Если вы получаете 11-15, он считается какa 4
  • Если вы получаете 16-20, это считается как 5
  • Если вы получаете 21, это считается как 3

Преимущество в этомвариант, вы получите четкое представление о точных вероятностях, с которыми вы имеете дело.Вы можете получить представление о том, насколько точно или часто встречается каждое число, и получить детальный контроль над тем, насколько часто каждое число является обычным по сравнению с другими числами.

Вы также можете использовать дроби для генерацииТаблица.Используйте Least Common Multiple , чтобы определить общую базу.Эта база - максимальный размер случайного числа, который вам понадобится.Затем поместите все дроби в одинаковые термины.Используйте полученные числители, чтобы определить размер диапазона для каждого числа в таблице.

Благодаря этому автоматизированному решению вводимые числа очень легко понять относительно друг друга.Например:

  • 1/4 для 1
  • 1/4 для 2
  • 1/4 для 4
  • 1/5 для 5
  • 1/20 для 3

Это приведет к созданию таблицы следующим образом:

LCM = 20

  • 1-5 = 1(аналогичные термины - 5/20)
  • 6-10 = 2 (5/20)
  • 11-15 = 4 (5/20)
  • 16-19 =5 (4/20)
  • 20 = (1/20)

Еще немного о LCM: http://en.wikipedia.org/wiki/Least_common_multiple

11 голосов
/ 19 октября 2010

Один простой для понимания вариант:

  • Генерируйте одно число, чтобы определить, собираетесь ли вы возвращать редкое число (например, сгенерируйте число в диапазоне [0-99], а если оно равно 0, верните редкое число
  • Если вы дойдете до этого шага, вы возвращаете не редкое число: продолжайте генерировать числа в нормальном диапазоне до тех пор, пока не получите какое-либо не редкое число, и верните это

Существуют и другие альтернативные подходы, которые требуют, чтобы вы генерировали только одно число, но вышеописанное кажется, что было бы проще всего написать и понять.

5 голосов
/ 19 октября 2010

Вы можете создать массив, содержащий числа в соответствии с их вероятностью:

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

Это не очень элегантно, но работает и легко масштабируется, если вероятности становятся более сложными.

1 голос
/ 30 января 2013

Давайте пройдем через это.Сначала мы используем функцию srand () для заполнения рандомизатора.По сути, компьютер может генерировать случайные числа на основе числа, которое передается в srand ().Если вы дали одинаковое начальное значение, то каждый раз будут генерироваться одни и те же случайные числа.

Следовательно, мы должны заполнить рандомизатор значением, которое всегда меняется.Мы делаем это, передавая значение текущего времени с помощью функции time ().

Теперь, когда мы вызываем rand (), каждый раз будет генерироваться новое случайное число.

#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;
}
1 голос
/ 19 октября 2010

Сумма всех вероятностей должна быть равна 1. Теперь мы работаем здесь с дискретными вероятностями в конечном диапазоне, поэтому мы рассматриваем (здесь) 5 возможностей с некоторым распределением, которое у вас есть, назовите их p1, p2, p3, p4 иp5 сумма которых равна 1.

f0 = 0 f1 = p1 f2 = f1 + p2 f3 = f2 + p3 f4 = f3 + p4 f5 = f4 + p5 и должна быть 1

Сгенерируйте случайное число от 0 до 1, и мы предположим, что оно не может быть ровно 1. Посмотрите на значение f, которое соответствует его потолку, и это значение вашего случайного события.Так что, возможно,

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

Если ваше случайное число равно 0,645, то вы сгенерировали 4 события.С учетом вышесказанного у вас есть в два раза меньше шансов на получение 3, чем у любого другого.Мы можем сделать его еще менее вероятным, например:

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

0,24, вероятно, других и только 0,04 из 3.

0 голосов
/ 19 октября 2010
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

Примечание: это быстро для обычного случая или возврата не редкого числа.

...