2010-10-19 2 views
11

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

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

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

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

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

Спасибо

+9

Я держал пари, что этот парень работает для онлайн казино :) – Joony

+0

NOP ... я работаю на матч 3 головоломки .. – Rony

+1

Вы также можете быть заинтересованы в gamedev.stackexchange.com :) – badp

ответ

26

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

рулонных 1 D 21 (легко, возможно, ж/код).

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

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

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

С помощью этого автоматизированного решения номера ввода очень легко понять по отношению друг к другу. E.г:

  • 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

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

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

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

+4

Вам не нужно для многократного создания чисел на втором этапе просто уменьшите диапазон на единицу, и если случайное число> = редкое число, увеличьте его. – Skizz

+0

@Skizz: Вы конечно * можете * сделать это, да. Это было бы более эффективно. Я думаю, что для этого потребуется больше циклов мозга, чем просто повторение - по крайней мере для меня - но это все еще хорошая идея. –

5

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

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

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

+0

+1; Это способ реализовать мое решение выше, если хранение заканчивается на низком уровне, это не проблема, или это хорошее компромиссное или процессорное время. –

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 

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

1

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

Это решение выглядит многообещающим, но ваше объяснение сбивает с толку. Можете ли вы объяснить, как вы определяете, какое значение выбрано? Причина, по которой мне нравится этот ответ, заключается в том, что вы минимизируете задействованные вычисления (случайные значения всегда генерируются между 0.0 и 1.0), и вам требуется только одно значение для каждого типа результата. –

+0

Это изящно, но требует удвоений и двоичного поиска через набор значений отсечки. Не конец света, а оценка эффективности. Другими словами, это хорошо по-другому - проще установить и понять, чем общие множественные вычисления подхода Мерлина. –

+0

Да, это было бы относительно медленно, более быстрый способ - создать статическую таблицу. Возможно, у нас есть 256 значений в статической таблице, каждая из которых содержит число от 1 до 5, и вы выбираете случайное число от 0 до 255, а затем смотрите в таблицу, какое значение оно имеет отношение. – CashCow

1

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