Загрузка...

[C#] Шарит кто как задать шанс на выпадение числа?

Тема в разделе C# создана пользователем Векс 6 апр 2021. 681 просмотр

  1. Векс
    Векс Автор темы 6 апр 2021 Заблокирован(а) 1200 2 июл 2019
    В гугле либо хуйня какая-то, либо слишком замудренно.
    Допустим мне надо генерить число от 0 до 100, причем чем выше число тем меньше шас на его выпадение, как это можно реализовать? (Шансы на выпадения я могу вручную указывать)
     
  2. xmka
    xmka 6 апр 2021 26 8 фев 2019
    Вот примитивный пример, но вроде рабочий:
    Код
    using System;
    using System.Collections.Generic;
    using System.Diagnostics;

    namespace testrand
    {
    class Program
    {
    public static Stopwatch sW = new Stopwatch();

    private static readonly Random random = new Random();

    static void Main()
    {
    sW.Start();
    // Code Start

    int k = 100; //количество элементов
    int j = 100; //максимальный вес
    int t = 0; //сумма весов
    int d = 1000000; //количество итераций


    Dictionary<int, int> v = new Dictionary<int, int>(); //индексный массив элементов
    Dictionary<int, int> w = new Dictionary<int, int>(); //индексный массив соответствующих весов
    Dictionary<int, int> tc = new Dictionary<int, int>();

    //заполнение для проверки
    for (int i = 1; i <= k; i++)
    {
    v.Add(i, i);
    w.Add(i, j);
    tc.Add(i, 0);
    t += j;
    j--;
    //Console.WriteLine(v[i] + " " + w[i]);
    }

    //выбор случайного элемента с учетом веса
    for (int z = 0; z < d; z++)
    {
    var r = random.Next(w[100], t);//случайное число от минимального до суммы весов
    var n = 0;

    for (int i = 1; i <= v.Count; i++)
    {
    n += w[i];

    if (n >= r)
    {
    tc[i]++;

    Console.WriteLine("Random: " + r + " - " + v[i]);//выпавшее числи и соответствующий ему элемент
    break;
    }
    }
    }

    //вывод результата
    for (int i = 1; i <= k; i++)
    {

    Console.WriteLine(i + " - " + tc[i]);
    }

    // Code End
    sW.Stop();
    Console.WriteLine("Время: " + sW.Elapsed.Hours + ":" + sW.Elapsed.Minutes + ":" + sW.Elapsed.Seconds + ":" + sW.Elapsed.Milliseconds);
    Console.WriteLine("Секунд: " + sW.Elapsed.TotalSeconds);
    // End program
    Console.WriteLine("Нажмите Enter");
    Console.ReadLine();
    }
    }
    }
    Вот результаты работы данного скрипта (на 1 000 000 операций):
    Код

    Выпавшее число - Количество
    1 - 19963
    2 - 19185
    3 - 19179
    4 - 19122
    5 - 19142
    6 - 18741
    7 - 18907
    8 - 18305
    9 - 18178
    10 - 17796
    11 - 17944
    12 - 17550
    13 - 17470
    14 - 17204
    15 - 16980
    16 - 16838
    17 - 16680
    18 - 16398
    19 - 16145
    20 - 16001
    21 - 15857
    22 - 15556
    23 - 15397
    24 - 15424
    25 - 15102
    26 - 14824
    27 - 14718
    28 - 14495
    29 - 14251
    30 - 14186
    31 - 13935
    32 - 13819
    33 - 13657
    34 - 13402
    35 - 13083
    36 - 12926
    37 - 12655
    38 - 12417
    39 - 12216
    40 - 12169
    41 - 11934
    42 - 11551
    43 - 11569
    44 - 11365
    45 - 10853
    46 - 10974
    47 - 10592
    48 - 10540
    49 - 10347
    50 - 10228
    51 - 9961
    52 - 9710
    53 - 9610
    54 - 9335
    55 - 9003
    56 - 8837
    57 - 8736
    58 - 8538
    59 - 8247
    60 - 8044
    61 - 8003
    62 - 7555
    63 - 7544
    64 - 7438
    65 - 7122
    66 - 6941
    67 - 6627
    68 - 6522
    69 - 6231
    70 - 6257
    71 - 5949
    72 - 5768
    73 - 5501
    74 - 5269
    75 - 5143
    76 - 4858
    77 - 4789
    78 - 4669
    79 - 4296
    80 - 4156
    81 - 3895
    82 - 3633
    83 - 3540
    84 - 3345
    85 - 3175
    86 - 3119
    87 - 2767
    88 - 2613
    89 - 2383
    90 - 2171
    91 - 2008
    92 - 1842
    93 - 1574
    94 - 1460
    95 - 1218
    96 - 1026
    97 - 798
    98 - 599
    99 - 405
    100 - 0
     
  3. Yotic
    Yotic 12 апр 2021 Ебашу на C# всё что захотите(Разноцветное) 43 13 янв 2021
    Привет , написал код за пару минут , не знаю работает ли , не у ПК , писал на телефоне, вот код:
    int answer;
    void RandomeNumber()
    {
    answer = -1;
    int[] num = new int[];
    int[] numtest = new int[];
    Array.Clear(num, 0, 100);
    Array.Clear(numtest, 0, 100);
    Random rnd = new Random();
    for(int i = 0; i < 100; i++)
    {
    num = rnd.Next(1 , 100);
    numtest[num - 1] += 1;
    for(int p = 0; p < i; p++)
    if(numtest[p] == i)
    {
    answer = i
    Break;
    }
    if(answer != -1)
    break;
    if(i == 100)
    RandomeNumber();
    }
    }
     
Загрузка...
Top