C # Jak wygenerować liczbę losową w zakresie z tendencją do dolnego końca zakresu? [duplikować]

Nov 19 2020

Cześć! Mój kod to:

    class Program
        {
            static void Main(string[] args)
            {
                for (int x = 0; x < 15000; x++)
                {
                    int minValue = 1;
                    int maxValue = 1400;
                var rand = new Random();

                List<float> weights = new List<float>();
                List<float> numbers = new List<float>();
                for (int i = minValue; i <= maxValue; i++)
                {
                    weights.Add((int)Math.Pow(i, 0.4));
                    numbers.Add(i);
                }
                weights.Reverse();

                int weightSum = 0;
                foreach (int weight in weights)
                {
                    weightSum += weight;
                }

                List<int> possibleNumberList = new List<int>();

                float randomNumber = rand.Next(minValue, weightSum);

                float leastDifference = 2000000000f;
                int leastDifferenceNumberIndex = -1;
                for (int weightIndex = 0; weightIndex < weights.Count - 1; weightIndex++)
                {
                    if (Math.Abs(weights[weightIndex] - randomNumber) == leastDifference)
                    {
                        leastDifference = Math.Abs(weights[weightIndex] - randomNumber);
                        leastDifferenceNumberIndex = weightIndex;

                        possibleNumberList.Add(weightIndex);
                    }
                    else if (Math.Abs(weights[weightIndex] - randomNumber) < leastDifference)
                    {
                        leastDifference = Math.Abs(weights[weightIndex] - randomNumber);
                        leastDifferenceNumberIndex = weightIndex;
                        possibleNumberList = new List<int>();
                        possibleNumberList.Add(weightIndex);
                    }
                }

                var randFromListR = new Random();

                int listCunt = possibleNumberList.Count;
                int index = randFromListR.Next(0, listCunt);
                WWriteStringToNewLine(possibleNumberList[index].ToString());
            }
        }
    }

Moim celem jest wyświetlenie listy lub tablicy na obrazku

Chociaż moja maksymalna wartość dla mnie wynosiłaby 1400.

Za pomocą mojego kodu mogę uzyskać tylko następujące wyniki:

Jeśli powiększymy, zobaczymy, że jest kilka wyższych liczb, ale wygenerowanych tylko raz.

Jeśli ustawimy maksymalną wartość kodu na 10, wynik będzie następujący:

{3: 2837, 0: 2813, 4: 2781, 2: 2761, 1: 2759, 5: 273, 6: 264, 7: 262, 8: 250}

Co mogę zmienić w tym kodzie, aby działał poprawnie? Co sugerujesz? Możesz mi nawet podać zupełnie inny kod.

Odpowiedzi

1 Warny Nov 19 2020 at 09:16

Jeśli zastosujesz funkcję do losowego wyniku, która zmieni podział liczb. Wypróbowałem następujące: Exp (Random.Next (0,10000) / 100d) wygeneruje liczbę z podziałem, którego najwyraźniej szukasz

Sqrt (Random.Next (0,10000)) wygeneruje liczbę od 0 do 100 z podziałem na pierwiastek kwadratowy.

W razie potrzeby możesz wziąć część całkowitą