BG Development


  Reply to this topicStart new topicStart Poll

> PHP - проценти и работа с тях
YipMan
Публикувано на: 09-10-2018, 15:53
Quote Post



Име:
Група: Потребител
Ранг: Новопостъпил

Мнения: 1
Регистриран на: 09.10.18



Здравейте,
имам нужда от малко помощ с логиката при разпределение на проценти и вероятността да се случи нещо.

Имам списък с продукти:
- мляко 50%
- кафе 30%
- вода 20%

Трябва при отварянето на даден екшън да се избере една от тези три опции (условно казано) и шанса за падането на тази опция да зависи от процента, който е зададен.
Процента да се падне мляко е 50% от всички заявки. Но въпреки това трябва да е сравнително рандъм icon_smile.gif

Благодаря предварително за насоките и съдействието.
PMEmail Poster
Top
JanBirdX
Публикувано на: 09-10-2018, 16:48
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 1587
Регистриран на: 21.02.05



rand-> 0-1
0.0-0.5 мляко
0.5-0.8 кафе
0.8-1.0 вода
PMEmail Poster
Top
stewie
Публикувано на: 10-10-2018, 00:30
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 5016
Регистриран на: 14.07.16



QUOTE (JanBirdX @ 09-10-2018, 17:48)
rand-> 0-1
0.0-0.5 мляко
0.5-0.8 кафе
0.8-1.0 вода

Тактовете на цпуто и вероятности са крайно несъвместими.
PM
Top
JanBirdX
Публикувано на: 10-10-2018, 07:16
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 1587
Регистриран на: 21.02.05



QUOTE (stewie @ 10-10-2018, 00:30)
Тактовете на цпуто и вероятности са крайно несъвместими.

а комбинацията: тактове, температура, напрежение и активност на слънцето отнесени към вероятности съвместими ли са?
PMEmail Poster
Top
stewie
Публикувано на: 10-10-2018, 09:36
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 5016
Регистриран на: 14.07.16



QUOTE (JanBirdX @ 10-10-2018, 08:16)
QUOTE (stewie @ 10-10-2018, 00:30)
Тактовете на цпуто и вероятности са крайно несъвместими.

а комбинацията: тактове, температура, напрежение и активност на слънцето отнесени към вероятности съвместими ли са?

Не те троля бе. Не съществува истински рандом генератор. Решението дето го даваш е стандартно, някои даже си правят масив с елементите в съотношение вероятността да се паднат и после избират рандом индекс от него. Интересно ако имаш примерно 100 елемента равновероятни по 0.01, и пак ползваме тая схема, тоя генератор колко пъти ще ти върне най-първият. Почти никога.
PM
Top
SuN
Публикувано на: 10-10-2018, 10:14
Quote Post


Group Icon
Име:
Група: Администратор
Ранг: Почетен член

Мнения: 7893
Регистриран на: 27.01.05



Така е, затова се правят симулации да видиш, че се пада въобще (няма програмна грешка). Дали в крайния продукт ще се падне е все тая.
PMEmail Poster
Top
JanBirdX
Публикувано на: 10-10-2018, 10:26
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 1587
Регистриран на: 21.02.05



QUOTE (stewie @ 10-10-2018, 09:36)
Не те троля бе. Не съществува истински рандом генератор. Решението дето го даваш е стандартно, някои даже си правят масив с елементите в съотношение вероятността да се паднат и после избират рандом индекс от него. Интересно ако имаш примерно 100 елемента равновероятни по 0.01,  и пак ползваме тая схема, тоя генератор колко пъти ще ти върне най-първият. Почти никога.

И аз не те троля, почти... https://en.wikipedia.org/wiki/RdRand
PMEmail Poster
Top
stewie
Публикувано на: 10-10-2018, 11:31
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 5016
Регистриран на: 14.07.16



Аз бих разбъркал още повече манджата и то на всяка заявка. Вземаш съотношението на вероятностите на елементите. Тука е 5:3:2. Правиш си некъв масив с 10 елемента. С рандом пак попълваш тоя масив съответно там с 5 бахур, 3 създарма и 2 дроб сърма. И чак тогава си вземаш рандом число 0 - 1, умножаваш по 10, после го floor-ваш и по тоя индекс вземаш от масива.
PM
Top
JanBirdX
Публикувано на: 10-10-2018, 15:33
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 1587
Регистриран на: 21.02.05



А няма ли да е по-просто така:
CODE
rand -> [0, RAND_MAX)
a1 + a2 + ... + an = RAND_MAX
for(i = 0; i < a.len; i++) {
  if rand < a[i]
     return i
 
  rand -= a[i]
}
return len - 1//TODO: is it possible
PMEmail Poster
Top
7bH5ypIdk9Ij
  Публикувано на: 25-11-2018, 10:48
Quote Post



Име:
Група: Потребител
Ранг: Новопостъпил

Мнения: 20
Регистриран на: 25.11.18



QUOTE (YipMan @ 09-10-2018, 15:53)
Здравейте,
имам нужда от малко помощ с логиката при разпределение на проценти и вероятността да се случи нещо.

Имам списък с продукти:
- мляко 50%
- кафе 30%
- вода 20%

Трябва при отварянето на даден екшън да се избере една от тези три опции (условно казано) и шанса за падането на тази опция да зависи от процента, който е зададен.
Процента да се падне мляко е 50% от всички заявки. Но въпреки това трябва да е сравнително рандъм icon_smile.gif

Благодаря предварително за насоките и съдействието.

Отне известно време ама вече можеш да си сложиш каквито искаш неща в "$percentages" и то ще ти избере едно от тях.. ако някой не го кефи да ползва rand() може да ползва друго, не пречи.

Като цяло идеята ми е че дефинирам граници в масив за Мляко, кафе, вода примерно от 1 до 50 е Мляко, от 51 до 80 е кафе и т.н.

За да измисля границите взимам 1 за изходно число за $last и после добавям към $last докато дефинирам нови и нови граници: 1->50 (долна и горна за мляко)->51->80 (долна и горна за кафе) и т.н....

После генерирам едно реално число от 1 до 100 и гледам в кои граници се вмества. И ти показвам резултатите.

С цветен код: https://gist.github.com/YavorK/c5e5514c9c80...b40d2d8e3088290


CODE

<?php

$percentages = [
   'Milk' => 50,
   'Coffee' => 30,
   'Water' => 20,
];
$percentSum = 0;
foreach ($percentages as $valuePercent) {
   $percentSum = $percentSum + $valuePercent;
}

if ($percentSum > 100) {
   echo 'The sum of the percentages cannot be more than 100. Current sum is ' . $percentSum;
   exit;
}


$boundaries = [];
$last = null;
foreach ($percentages as $name => $chance) {
   //if there was no last boundary added
   if($last === null){
       $boundaries[$name . '_down'] = 1;
   } else {
       $boundaries[$name . '_down'] = $last + 1;
   }
   $boundaries[$name . '_up'] = $last + $chance;

   //update last reached number
   $last = $boundaries[$name . '_up'];
}

echo 'Boundaries:<br>';
foreach ($boundaries as $boundaryKey => $boundaryValue) {
   echo $boundaryKey . ' boundary is ' . $boundaryValue . "<br>";
}


$randomNumber = rand(1, 100);

echo '<br>';

foreach ($percentages as $name => $key) {
   if ($boundaries[$name . '_down'] <= $randomNumber && $randomNumber <= $boundaries[$name . '_up']) {
       echo "You got: " . $name . '<br>';
       echo 'Lower boundary is: ' . $boundaries[$name . '_down'] . '<br>';
       echo 'Your number was: ' . $randomNumber . '<br>';
       echo 'Upper boundary is: ' . $boundaries[$name . '_up'] . '<br>';
   }
}



Примерен аутпут:

Run 1:

Boundaries:
Milk_down boundary is 1
Milk_up boundary is 50
Coffee_down boundary is 51
Coffee_up boundary is 80
Water_down boundary is 81
Water_up boundary is 100

You got: Water
Lower boundary is: 81
Your number was: 84
Upper boundary is: 100

----

Run 2:

Boundaries:
Milk_down boundary is 1
Milk_up boundary is 50
Coffee_down boundary is 51
Coffee_up boundary is 80
Water_down boundary is 81
Water_up boundary is 100

You got: Milk
Lower boundary is: 1
Your number was: 28
Upper boundary is: 50

---

Run 3:

Boundaries:
Milk_down boundary is 1
Milk_up boundary is 50
Coffee_down boundary is 51
Coffee_up boundary is 80
Water_down boundary is 81
Water_up boundary is 100

You got: Milk
Lower boundary is: 1
Your number was: 50
Upper boundary is: 50

Това мнение е било редактирано от 7bH5ypIdk9Ij на 25-11-2018, 10:51
PMEmail Poster
Top
1 потребители преглеждат тази тема в момента (1 гости, 0 анонимни потребители)
Потребители, преглеждащи темата в момента:

Topic Options Reply to this topicStart new topicStart Poll

 


Copyright © 2003-2019 | BG Development | All Rights Reserved
RSS 2.0