Как сгенерировать случайные числа и вставить их в очередь с приоритетами? - PullRequest
0 голосов
/ 07 апреля 2019

Я реализовал PriorityQueue, используя SLList с необходимыми функциями.Я хочу сгенерировать 100 случайных целых чисел и добавить их в очередь (объект класса PriorityQueue).Затем выведите первые 20 чисел из очереди.

Я попытался сгенерировать случайные числа с помощью RandomGenerator (), но он всегда дает одно и то же случайное число.Цикл для генерации 100 случайных чисел работает нормально, но всегда выдвигает одно и то же случайное число.Как мне сгенерировать случайные числа и вставить их в очередь с приоритетами?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp5
{
    class Class1
    {

        public class Node
        {
            public int data;
            public int priority;

            public Node next;
        }

        public static Node node = new Node();
        public static Node newNode(int d, int p)
        {
            Node temp = new Node();
            temp.data = d;
            temp.priority = p;
            temp.next = null;

            return temp;
        }

        public static int peek(Node head)
        {
            return (head).data;
        }

        public static Node pop(Node head)
        {
            Node temp = head;
            (head) = (head).next;
            return head;
        }
        public static Node push(Node head,int d, int p)
        {
            Node start = (head);
            Node temp = newNode(d, p);
            if ((head).priority > p)
            {

                // Insert New Node before head  
                temp.next = head;
                (head) = temp;
            }
            else
            {
                while (start.next != null &&
                       start.next.priority < p)
                {
                    start = start.next;
                }

                // Either at the ends of the list  
                // or at required position  
                temp.next = start.next;
                start.next = temp;
            }
            return head;
        }

        public static int isEmpty(Node head)
        {
            return ((head) == null) ? 1 : 0;
        }
        public class RandomGenerator
        {
            // Generate a random number between two numbers    
            public int RandomNumber(int min, int max)
            {
                Random random = new Random();
                return random.Next(min, max);
            }
            public string RandomPassword()
            {
                StringBuilder builder = new StringBuilder();
                builder.Append(RandomNumber(1000, 9999));
                return builder.ToString();
            }
        }
        public static void Main(string[] args)
        {
            /*
            Node pq = newNode(4, 1);
            pq = push(pq, 5, 2);
            pq = push(pq, 6, 3);
            pq = push(pq, 7, 0);


            while (isEmpty(pq) == 0)
            {
                Console.Write("{0:D} ", peek(pq));
                pq = pop(pq);
            } */
            RandomGenerator generator = new RandomGenerator();
            Node pq = newNode(4, 0);
            int p = 1;
            // Console.WriteLine($"Random number  is {rand}");
            for (int i = 0; i < 100; i++)
            {
                int rand = generator.RandomNumber(0, 1000000);

                pq = push(pq, rand, p);
                p = p + 1;
            }
            while (isEmpty(pq) == 0)
            {
                Console.Write("{0:D} ", peek(pq));
                pq = pop(pq);
            }
        }
           // Console.ReadKey();
        }
    }

Я ожидаю вывод: 8 200 1 2 5 4 3 ... (т.е. любые сгенерированные случайные числа), тогда как я получаювывод: 6 200 200 200 200 200 ... (то есть то же случайное число, которое отправляется в приоритетную очередь)

1 Ответ

2 голосов
/ 07 апреля 2019

Когда вы создаете объект Random, его начальное число инициализируется на основе текущего времени.Если вы создадите много Random объектов одновременно, все они будут инициализированы с одним и тем же начальным числом и вернут одно и то же число при вызове Next.

Вместо этого вам следует создать только один * 1006.* object, а затем вызовите Next несколько раз для одного и того же объекта:

    public class RandomGenerator
    {
        private Random random = new Random();

        // Generate a random number between two numbers    
        public int RandomNumber(int min, int max)
        {
            return random.Next(min, max);
        }
...