2009-06-25 34 views
8

Tất cả những gì tôi muốn là một thực dụng trình tạo số ngẫu nhiên trong C# để tôi có thể nói ví dụ:Cách dễ nhất để tạo số ngẫu nhiên bán trong C# là gì?

int dummyAge = MathHelpers.GetRandomNumber(20,70); 

và có nó dường như bán ngẫu nhiên, ví dụ để tạo dữ liệu giả.

Hầu hết stack overflow questions on this topic và trên web tham gia vào một cuộc thảo luận triết học trên ngẫu nhiên thực sự không phải là điều tôi quan tâm vào lúc này, ví dụ: Tôi đã làm một trong PHP một thời gian dài trước đó sử dụng mili giây/ngủ đó là tốt cho dữ liệu giả, Tôi chỉ cố gắng để làm điều này trongC# nhanh chóng.

Có ai có nhanh chóng Máy phát số ngẫu nhiên C# ngẫu nhiên dựa trên một số hạt thời gian, v.v ... hay không, làm cách nào để thay đổi mã sau đây. ?

using System; 

namespace TestRandom23874 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Console.WriteLine("the random number is: {0}", MathHelpers.GetRandomNumber(1, 10)); 
      Console.WriteLine("the random number is: {0}", MathHelpers.GetRandomNumber(1, 10)); 
      Console.WriteLine("the random number is: {0}", MathHelpers.GetRandomNumber(1, 10)); 
      Console.WriteLine("the random number is: {0}", MathHelpers.GetRandomNumber(1, 10)); 
      Console.WriteLine("the random number is: {0}", MathHelpers.GetRandomNumber(1, 10)); 
      Console.ReadLine(); 
     } 
    } 

    public class MathHelpers 
    { 
     public static int GetRandomNumber(int min, int max) 
     { 
      Random random = new Random(); 
      return random.Next(min, max); 
     } 
    } 
} 
+0

Tôi nghĩ bạn có nghĩa là "giả ngẫu nhiên". Quasi-random có ​​nghĩa là cái gì khác. –

+0

Tôi nghĩ rằng quasi ("như thể, như thể nó, theo cách thức hay mức độ, có một số điểm tương đồng với") là phù hợp hơn trong ý nghĩa này hơn giả ("không chính hãng nhưng có sự xuất hiện") vì chúng là số ngẫu nhiên chính hãng cho người dùng trung bình, nhưng chúng là số ngẫu nhiên cho một nhà toán học "chỉ trong một vấn đề hoặc bằng cấp". –

Trả lời

13
public class MathHelpers 
    { 
     private static Random random = new Random(); 
     public static int GetRandomNumber(int min, int max) 
     { 
      return random.Next(min, max); 
     } 
    } 

Bằng cách này, bạn không tạo ra một đối tượng ngẫu nhiên mới mọi thời gian, chứ không phải bạn đang tái sử dụng cùng một. Khi bạn tạo lại một cái mới đủ nhanh, chúng sẽ mang lại kết quả tương tự. Tuy nhiên, nếu bạn sử dụng lại cái hiện có, bạn sẽ nhận được sự ngẫu nhiên.

+0

tuyệt vời, đó là tất cả những gì tôi cần, cảm ơn! –

+1

Lưu ý: Điều này đúng với C# nhưng cũng có trong nhiều ngôn ngữ khác (C, C++, Java, ...). Bạn thường nhân giống RNG của bạn một lần, và tái sử dụng nó miễn là bạn cần nó. Tôi không thể nhớ bao nhiêu lần tôi thấy mọi người yêu cầu trợ giúp về các diễn đàn liên quan đến dev bởi vì họ vẫn giữ lại RNG của họ. – Ksempac

+1

Tôi không nghĩ đây là chủ đề an toàn ... –

2

Câu trả lời của BFree là tốt, nhưng tôi nghĩ nó cũng đáng nhắc đến một kiểu hơi khác - chuyển thể hiện Random vào bất kỳ thứ gì cần, thay vì luôn sử dụng một cá thể thông qua biến tĩnh. Nhược điểm của phương pháp thứ hai là Random không an toàn cho luồng. Bạn có thể cần một số khóa, hoặc các biến thread-local, hoặc tránh sử dụng nhiều luồng để bắt đầu. Vì vậy, tôi sẽ điều chỉnh mã ban đầu trong câu hỏi thành:

using System; 

namespace TestRandom23874 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Random rng = new Random(); 
      Console.WriteLine("the random number is: {0}", 
       MathHelpers.GetRandomNumber(rng, 1, 10)); 
      Console.WriteLine("the random number is: {0}", 
       MathHelpers.GetRandomNumber(rng, 1, 10)); 
      Console.WriteLine("the random number is: {0}", 
       MathHelpers.GetRandomNumber(rng, 1, 10)); 
      Console.WriteLine("the random number is: {0}", 
       MathHelpers.GetRandomNumber(rng, 1, 10)); 
      Console.WriteLine("the random number is: {0}", 
       MathHelpers.GetRandomNumber(rng, 1, 10)); 
     } 
    } 

    public class MathHelpers 
    { 
     public static int GetRandomNumber(Random random, int min, int max) 
     { 
      return random.Next(min, max); 
     } 
    } 
} 

Nó thực sự chỉ là đảo ngược kiểm soát cơ bản. Bạn có thể có một RNG tĩnh với khóa vòng, được sử dụng để tạo một phiên bản mới Random theo cách an toàn khi bạn cần (bằng cách tạo ngẫu nhiên hạt giống và sau đó sử dụng để tạo mẫu) rồi sử dụng lại Random trong suốt một bộ hoạt động đơn luồng cụ thể.

+0

Giải pháp tốt nếu bạn cần an toàn chỉ. Tuy nhiên, tôi sẽ thả phương thức trợ giúp hoàn toàn trong trường hợp này, vì phương thức trợ giúp của bạn được giảm xuống một cuộc gọi trên một mục hiện có. – Ksempac

+0

Ồ hoàn toàn. Đây chỉ là một ví dụ về cách tiếp cận :) –

+0

Đây có thực sự là chương trình "TestRandom" 23,874th của bạn không? :) –

1

Vấn đề (của 5 số giống nhau) là vấn đề về thời gian, câu trả lời của BFree giải quyết được vấn đề. Lớp Random là tự gieo hạt bằng cách sử dụng bộ đếm thời gian, các cuộc gọi của bạn rất gần nhau, họ sử dụng cùng một hạt giống.

Các vấn đề liên quan