В гугле либо хуйня какая-то, либо слишком замудренно. Допустим мне надо генерить число от 0 до 100, причем чем выше число тем меньше шас на его выпадение, как это можно реализовать? (Шансы на выпадения я могу вручную указывать)
Вот примитивный пример, но вроде рабочий: 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(); } } } Код 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 Код Выпавшее число - Количество 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
Привет , написал код за пару минут , не знаю работает ли , не у ПК , писал на телефоне, вот код: 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(); } }