2016-11-07 5 views
0

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

Random rnd = new Random(); 
     int random1 = rnd.Next(1, 24); 
     int random2 = rnd.Next(25, 49); 

     int random3 = rnd.Next(random1, random2); 

     int random4 = rnd.Next(50, 74); 
     int random5 = rnd.Next(75, 100); 

     int random6 = rnd.Next(random4, random5); 

     int random7 = rnd.Next(random3, random6); 
     Console.WriteLine(random7); 

быть больше случайного числа, чем просто сказать

Random rnd = new Random(); 
int random1 = rnd.Next(1, 100); 
Console.WriteLine(random1); 
+1

Не совсем. Я думаю, что это было бы даже менее случайным. –

+3

Вероятность иметь число от 1 до 100 во втором примере - такая же вероятность. однако вероятность получить «1» в первом примере менее возможна, чем получить 50. Как вам нужно получить 1 три раза подряд и 50 раз один раз. –

ответ

0

Первый подход дает нечто большее, чем изогнутое распределение, а не линейное распределение.

Попробуйте выполнить следующее приложение командной строки, и вы увидите разницу:

using System; 

namespace Demo 
{ 
    class Program 
    { 
     const int N = 1000000; 

     static void Main() 
     { 
      var result1 = testRandom(randomA); 
      var result2 = testRandom(randomB); 

      Console.WriteLine("Results for randomA():\n"); 
      printResults(result1); 

      Console.WriteLine("\nResults for randomB():\n"); 
      printResults(result2); 
     } 

     static void printResults(int[] results) 
     { 
      for (int i = 0; i < results.Length; ++i) 
      { 
       Console.WriteLine(i + ": " + new string('*', (int)(results[i]*2000L/N))); 
      } 
     } 

     static int[] testRandom(Func<Random, int> gen) 
     { 
      Random rng = new Random(12345); 

      int[] result = new int[100]; 

      for (int i = 0; i < N; ++i) 
       ++result[gen(rng)]; 

      return result; 
     } 

     static int randomA(Random rng) 
     { 
      return rng.Next(1, 100); 
     } 

     static int randomB(Random rnd) 
     { 
      int random1 = rnd.Next(1, 24); 
      int random2 = rnd.Next(25, 49); 

      int random3 = rnd.Next(random1, random2); 

      int random4 = rnd.Next(50, 74); 
      int random5 = rnd.Next(75, 100); 

      int random6 = rnd.Next(random4, random5); 

      return rnd.Next(random3, random6); 
     } 
    } 
} 
0

простой тестгистограмма) покажет вам фактическое распределение:

private static Random rnd = new Random(); 

private static int[] Hist() { 
    int[] freqs = new int[100]; 

    // 100 buckets, 1000000 samples; we might expect about 10000 values in each bucket 
    int n = 1000000; 

    for (int i = 0; i < n; ++i) { 
    int random1 = rnd.Next(1, 24); 
    int random2 = rnd.Next(25, 49); 

    int random3 = rnd.Next(random1, random2); 

    int random4 = rnd.Next(50, 74); 
    int random5 = rnd.Next(75, 100); 

    int random6 = rnd.Next(random4, random5); 

    int random7 = rnd.Next(random3, random6); 

    freqs[random7] = freqs[random7] + 1; 
    } 

    return freqs; 
} 

... 

Console.Write(string 
.Join(Environment.NewLine, Hist() 
    .Select((v, i) => $"{i,2}: {v,5}"); 

И вы получите что-то вроде

0:  0 <- OK, zero can't appear 
1:  21 <- too few (about 10000 expected) 
2:  56 <- too few (about 10000 expected) 
3: 125 ... 
4: 171 
5: 292 
6: 392 
7: 560 
8: 747 ... 
9: 931 <- too few (about 10000 expected) 
... 
45: 21528 <- too many (about 10000 expected) 
46: 21549 ... 
47: 21676 
48: 21699 
49: 21432 
50: 21692 
51: 21785 
52: 21559 
53: 21047 
54: 20985 ... 
55: 20820 <- too many (about 10000 expected) 
... 
90: 623 <- too few (about 10000 expected) 
91: 492 ... 
92: 350 
93: 231 
94: 173 
95: 88 
96: 52 
97: 13 
98:  0 ... 
99:  0 <- too few (about 10000 expected) 

Ничего подобного , равномерно распределены случайные значения, далеко от него, но вид колоколообразной кривой

1

Ваш вопрос предполагает, что есть степени случайности. Это неверно, случайность - это двоичное состояние. Если результат испытания не может быть предсказан с уверенностью, пробный номер случайный. В противном случае мы говорим, что это детерминированный. По аналогии, вы бы задали вопрос, который более мертв, кто-то убит пистолетом или кто-то, убитый электрошоком? Мертвый мертв! (*)

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

Если вы хотите зафиксировать степень предсказуемости, вероятно, вы должны спросить, какой алгоритм имеет более высокий entropy, а не более случайный. Известным результатом является то, что равномерное распределение имеет максимальную энтропию среди класса распределений с носителем на ограниченном интервале. Таким образом, ваш сложный алгоритм имеет более низкую энтропию, чем простое равномерное распределение, и более предсказуем.

(*) - За исключением «Невесты принцессы», где Уэсли только «в основном мертв».

+0

Я не знаю ... я думаю, что выстрел в голову можно считать «более мертвым», чем сказать удушье. Вы могли бы вернуть кого-то более легко через утопление/недостаток кислорода, чем убийство зомби: O – Kritner

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

  • Нет связанных вопросов^_^