2014-01-30 5 views
0

Итак, у меня есть карта < int, float>, содержащая смещения чисел 1 - 6. Мне нужно вернуть значение, которое смещено. Обратите внимание, что смещения не являются постоянными, поскольку они вводятся пользователем. Он находится в классе, поэтому все переменные уже объявлены.Случайное число с предубеждениями

Так вот что я сделал до сих пор.

int die:: randomNumber(map < int, float > &biasPercent) 
    { 
     randomString[0] << biasPercent[0]; 
     randomArray[0] = randomString[0].str(); 
     maximum = randomArray[0].size(); 

     for(counter = 0; counter < 6; counter++) 
     { 
      randomString[counter] << biasPercent[counter]; 
      randomArray[counter] = randomString[counter].str(); 

      if(randomArray[counter].size() > maximum) 
      { 
      maximum = randomArray[counter].size(); 
      } 
     } 

     limit = 1; 



     for(counter = 1; counter <= maximum - 2; counter++) 
     { 
      limit *= 10; 
     } 

     srand(time(NULL)); 

     random1 = rand() % limit + 1; 

     if(random1 <= biasPercent[0] * limit) 
     { 
      return 1; 
     } 

     else if(random1 > biasPercent[0] * limit && random1 <= (biasPercent[0] * limit) + (biasPercent[1] * limit)) 
     { 
      return 2; 
     } 

     else if(random1 > ((biasPercent[0] * limit) + (biasPercent[1] * limit) * limit) && random1 <= (((biasPercent[0] * limit) + (biasPercent[1] * limit)) + (biasPercent[2] * limit))) 
     { 
      return 3; 
     } 

     else if(random1 > (((biasPercent[0] * limit) + (biasPercent[1] * limit)) + (biasPercent[2] * limit)) && random1 <= (((((biasPercent[0] * limit) + (biasPercent[1] * limit)) + (biasPercent[2] * limit))) + (biasPercent[3] * limit))) 
     { 
      return 4; 
     } 

     else if(random1 > (((((biasPercent[0] * limit) + (biasPercent[1] * limit)) + (biasPercent[2] * limit))) + (biasPercent[3] * limit)) && random1 <= ((((((biasPercent[0] * limit) + (biasPercent[1] * limit)) + (biasPercent[2] * limit))) + (biasPercent[3] * limit))) + ((biasPercent[4] * limit))) 
     { 
      return 5; 
     } 

     else 
     { 
      return 6; 
     } 
    } 

Он не работает, поскольку он возвращает только 1 все время. Я предполагаю, что stringstream имеет к этому какое-то отношение. Но я не знаю другого способа узнать предел случайных чисел, чем преобразовать float в строку, а затем получить значение с большинством символов. Пожалуйста помоги.

+1

C++ имеет лучшую случайную библиотеку '' с явной поддержкой неравномерных распределений. Теперь вам нужно будет написать свой собственный дистрибутив, поскольку это особенно относится к вашему делу, но это нужно только для части распределения, а не для частичного генерации числа. – MSalters

+1

Вызов 'srand', прежде чем генерировать каждое число, не помогает. Если вы придерживаетесь 'rand', тогда вызывайте' srand' один раз в начале вашей программы. –

ответ

0

Проще всего было бы рассчитать partial_sum всех предубеждений. Последний элемент - сумма смещений. Теперь создайте случайное число со значением [0, sum] (используя uniform_real_distribution) и найдите индекс upper_bound в вашем partial_sum.

E.g. смещения [0,2, 0,5, 6, 2, 3, 0,1] дают partial_sum [0,2, 0,7, 6,7, 8,7, 11,7, 11,8], поэтому генерируют число от 0 до 11,8. Скажем, что это 4.378, верхняя граница 6,7 (третий элемент), поэтому результат равен 3.

Смежные вопросы