如何生成随机数并将它们插入优先级队列?

Posted

技术标签:

【中文标题】如何生成随机数并将它们插入优先级队列?【英文标题】:How do I generate random numbers and insert them to a priority queue? 【发布时间】:2019-04-07 08:26:17 【问题描述】:

我已经使用具有所需功能的 SLList 实现了 PriorityQueue。我想生成 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...(即同一个随机数被推入优先队列)

【问题讨论】:

请看一下这个问题:***.com/questions/767999/… 以更好地了解Random 的工作原理以及您可以根据需要使用哪些其他技术来生成随机数。 【参考方案1】:

当您创建Random 对象时,其种子会根据当前时间进行初始化。如果您同时创建多个Random 对象,它们都将使用相同的种子进行初始化,并在您调用Next 时返回相同的数字。

相反,您应该只构造一个Random 对象,然后在同一个对象上多次调用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);
        

【讨论】:

以上是关于如何生成随机数并将它们插入优先级队列?的主要内容,如果未能解决你的问题,请参考以下文章

数据结构与算法之美-堆的应用

优先级队列实现为单链接未能在插入时更新指针引用

Priority Queue

修改队列内容后如何从优先级队列中获取最小元素[重复]

初始化并插入优先级队列 (C++)

将键和值添加到优先级队列中并在 Java 中按键排序