Подтвердить что ты не робот

Создать случайное число между двумя номерами с одним редким номером

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

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

то теперь мое требование... я хочу сделать число редким.... thats mean if

высокий = 5, низкий = 1, и редкость = 3,

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

Спасибо

4b9b3361

Ответ 1

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

Roll 1 D 21 (возможно, возможно, w/code).

  • Если вы получаете 1-5, он считается 1
  • Если вы получаете 6-10, он считается 2
  • Если вы получаете 11-15, он считается 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

Ответ 2

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

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

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

Ответ 3

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

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

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

Ответ 4

Сумма всех вероятностей должна быть 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.

Ответ 5

Давайте рассмотрим это. Сначала мы используем функцию 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;
}

Ответ 6

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

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