2015-11-24 2 views
2

У меня есть куча предметов, чем диапазон в размере от 1 до 10.Как сделать выбор случайным образом на процент

Я хотел бы сделать размер, что элемент должен быть определен процент или случайно объекта в том, что размер ..

Например:

товары шанс быть размер 1 = 50 % шанс

товары шанс быть размером 5 = 20% шанс

товары шанс быть размер 10 = 5% шанс

Я KNO w Мне нужно было бы использовать случайный генератор для этого, конечно.

Но просто интересно, как некоторые из вас пойдут по логике этого в C#?

+0

Почему этот вопрос закрыт как дубликат «, как для генерации случайного целого "? –

+1

Заполните список 50-ю, 20-ю и 5-ю десятками (и другими, пока у вас не будет 100 предметов в списке). Затем получите случайное число от 0 до 99 и используйте его как индекс в списке, чтобы получить соответствующее значение. – Corak

+1

Нет, ОП спрашивает, как получить случайные числа с заданным распределением. Голосование. –

ответ

3

Прежде всего: вероятности, предоставляемые не добавляют до 100%:

50% + 20% + 5% = 75% 

Таким образом, вы должны проверок этих значений. Вы можете генерировать эти проценты:

// Simplest, but not thread safe 
    private static Random s_Random = new Random(); 

    ... 

    int perCent = s_Random.Next(0, 100); 

    if (perCent < 50) {    // 0 .. 49 
    // return Item of size 1 
    } 
    else if (perCent < 50 + 20) {  // 50 .. 69 
    // return Item of size 5 
    } 
    else if (perCent < 50 + 20 + 5) { // 70 .. 74 
    // return Item of size 10 
    } 
    ... 
+0

Awesome. Большое спасибо. Другое дело, что количество предоставленных предметов может варьироваться от 5 до 50. Так что есть способ распределить вес между любым числом между 1-50. Например - Элементы № 1 Максимальный размер - 50. Так как я могу сделать каждый размер весом? потому что внутри 50 есть размер 10, размер 2, размер 20 и т. д. Надеюсь, это имеет смысл. – coder4life22

1

использовать мой метод. Это просто и легко понять. Я не считаю часть в диапазоне 0 ... 1, я просто использую «Probabilityp Pool» (звучит круто, да?) Я делаю список со всеми элементами, из которых я хочу выбрать. У каждого элемента есть свой шанс. Полезно, чтобы установить самый общий элемент шанс = 100, так что большинство редких элементов будет 60 или 50.

At circle diagram you can see weight of every element in pool

Here you can see an implementing of accumulative probability for roulette

` 

// Some c`lass or struct for represent items you want to roulette 
public class Item 
{ 
    public string name; // not only string, any type of data 
    public int chance; // chance of getting this Item 
} 

public class ProportionalWheelSelection 
{ 
    public static Random rnd = new Random(); 

    // Static method for using from anywhere. You can make its overload for accepting not only List, but arrays also: 
    // public static Item SelectItem (Item[] items)... 
    public static Item SelectItem(List<Item> items) 
    { 
     // Calculate the summa of all portions. 
     int poolSize = 0; 
     for (int i = 0; i < items.Count; i++) 
     { 
      poolSize += items[i].chance; 
     } 

     // Get a random integer from 0 to PoolSize. 
     int randomNumber = rnd.Next(0, poolSize) + 1; 

     // Detect the item, which corresponds to current random number. 
     int accumulatedProbability = 0; 
     for (int i = 0; i < items.Count; i++) 
     { 
      accumulatedProbability += items[i].chance; 
      if (randomNumber <= accumulatedProbability) 
       return items[i]; 
     } 
     return null; // this code will never come while you use this programm right :) 
    } 
} 

// Example of using somewhere in your program: 
     static void Main(string[] args) 
     { 
      List<Item> items = new List<Item>(); 
      items.Add(new Item() { name = "Anna", chance = 100}); 
      items.Add(new Item() { name = "Alex", chance = 125}); 
      items.Add(new Item() { name = "Dog", chance = 50}); 
      items.Add(new Item() { name = "Cat", chance = 35}); 

      Item newItem = ProportionalWheelSelection.SelectItem(items); 
     } 
Смежные вопросы