Blame view

vendor/fzaninotto/faker/src/Faker/Provider/Biased.php 1.81 KB
ad2e91f7   Mihail   move multyparser ...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
  <?php
  
  namespace Faker\Provider;
  
  class Biased extends \Faker\Provider\Base
  {
      /**
       * Returns a biased integer between $min and $max (both inclusive).
       * The distribution depends on $function.
       *
       * The algorithm creates two doubles, x ∈ [0, 1], y ∈ [0, 1) and checks whether the
       * return value of $function for x is greater than or equal to y. If this is
       * the case the number is accepted and x is mapped to the appropriate integer
       * between $min and $max. Otherwise two new doubles are created until the pair
       * is accepted.
       *
       * @param integer $min Minimum value of the generated integers.
       * @param integer $max Maximum value of the generated integers.
       * @param callable $function A function mapping x ∈ [0, 1] onto a double ∈ [0, 1]
       * @return integer An integer between $min and $max.
       */
      public function biasedNumberBetween($min = 0, $max = 100, $function = 'sqrt')
      {
          do {
              $x = mt_rand() / mt_getrandmax();
              $y = mt_rand() / (mt_getrandmax() + 1);
          } while (call_user_func($function, $x) < $y);
          
          return floor($x * ($max - $min + 1) + $min);
      }
  
      /**
       * 'unbiased' creates an unbiased distribution by giving
       * each value the same value of one.
       *
       * @return integer
       */
      protected static function unbiased($x)
      {
          return 1;
      }
  
      /**
       * 'linearLow' favors lower numbers. The probability decreases
       * in a linear fashion.
       *
       * @return integer
       */
      protected static function linearLow($x)
      {
          return 1 - $x;
      }
  
      /**
       * 'linearHigh' favors higher numbers. The probability increases
       * in a linear fashion.
       *
       * @return integer
       */
      protected static function linearHigh($x)
      {
          return $x;
      }
  }