2011-02-03 16 views
5

के लिए यादृच्छिक मान कैसे प्राप्त करें मेरे पास एक ऐसा टूल है जो परीक्षण के लिए एक नमूना मान उत्पन्न करने के लिए आवश्यक संस्थाएं उत्पन्न करता है। समस्या ... हम तार्किक प्रकार (एक ही प्रकार के कुछ है लेकिन अभी भी अलग) की और कोडिंग मैं जानना चाहते हैं कि किसी को एक आसान समाधान है चाहता था befor बहुत है कि हैलॉजिकल टाइप्स

यहाँ Enum है:

public enum LogicalTypeEnum 
    { 
     Identity, 
     DateAndTime, 
     Binary, 
     Quantity, 
     Comment, 
     Money, 
     Rate, 
     TimeStamp, 
     Caption, 
     Reference, 
     Number, 
     Weight, 
     Space, 
     Username, 
     Phone, 
     Email, 
     ZipCode 
    } 

धन्यवाद !!!

संपादित करें 1: मैं एक यादृच्छिक मूल्य उत्पन्न करना चाहता हूं जो enum से यादृच्छिक तत्व नहीं मिलता है। मैं यादृच्छिक ईमेल या ज़िप कोड या धन मूल्य प्राप्त करने का एक तरीका खोज रहा हूं।

+0

क्या आसान समाधान है? मुझे लगता है कि आपके पास ऐसा समाधान है जो आपको लगता है कि यह असुरक्षित है, इसे पोस्ट करें और हमें देखने दें। :) – Chris

+0

यहां एक नज़र डालें: http://stackoverflow.com/questions/319814/generate-random-enum-in-c-2-0 –

+0

एक यादृच्छिक स्ट्रिंग यादृच्छिक लिखना आसान दोहरी यादृच्छिक नहीं है randomDateTime ^^ – Polo

उत्तर

5

मुझे लगता है कि आप को विभाजित करने के लिए है (ध्यान दें यह सिर्फ 1 यादृच्छिक मूल्य के लिए, पुन: उपयोग रैंडम जनरेटर और enumItemsCount अगले आइटम के लिए है) आपका जवाब दो भागों में:

सबसे पहले सूची में से एक यादृच्छिक enum प्रकार प्राप्त करें। मुझे लगता है कि यह हिस्सा पहले से दिए गए अन्य उत्तरों द्वारा हल किया गया है।

बाद में आप चयनित enum के लिए यादृच्छिक मानों की एक सूची बनाना पसंद करते हैं। तो आपको ऐसे कारखाने की आवश्यकता है जो इन प्रकारों में से प्रत्येक के लिए एक मान्य यादृच्छिक मूल्य बना सके। आपकी जरूरतों के सबसे करीब आने वाली चीज़ AutoPoco होनी चाहिए। यह कुछ मान आप उदाहरण

var factory = AutoPoco.AutoPocoContainer.Configure(x => 
{ 
    x.Conventions(c => 
    { 
     c.UseDefaultConventions(); 
    }); 

    x.Include<DataRowWrapper>() 
     .Setup(row => row.Timestamp).Use<DateTimeUniqueSource>() 
     .Setup(row => row.Name).Use<LastNameSource>() 
     .Setup(row => row.Value).Use<ApproximateNumberSource<decimal>>() 
     .Setup(row => row.Description).Use<RandomReadableStringSource>(10, 20); 
}); 

var session = factory.CreateSession(); 
var sampleRows = session.List<DataRowWrapper>(1000).Get(); 

के लिए चाहते से भर नमूना वस्तु का एक समूह बनाने के लिए काफी आसान है आप देख सकते हैं कि आप प्रत्येक संपत्ति के लिए अपने स्वयं के स्रोत (.Use<...Source>()) प्रदान कर सकते हैं। पहले से ही परियोजना के भीतर कुछ डिफ़ॉल्ट स्रोतों कर रहे हैं, लेकिन मैं भी निम्नलिखित की तरह अपने दम पर कुछ बनाया:

public class RandomReadableStringSource : DatasourceBase<string> 
{ 
    private readonly char[] _Vocals = new char[] { 'a', 'e', 'i', 'o', 'u' }; 
    private readonly char[] _Consonants = new char[] { 'b', 'c', 'd', 'f', 'g', 'h', 'k', 'l', 'm', 'n', 'p', 'r', 's', 't', 'v', 'w' }; 

    private Random _Random; 
    private int _Minimum; 
    private int _Maximum; 

    public RandomReadableStringSource() 
     : this(20) 
    { } 

    public RandomReadableStringSource(int max) 
     : this(5, max) 
    { } 

    public RandomReadableStringSource(int min, int max) 
    { 
     if (min <= 0) 
     { 
      throw new ArgumentOutOfRangeException("minimum must be greater zero."); 
     } 

     if (min > max) 
     { 
      throw new ArgumentOutOfRangeException("minimum must be less or equal maximum."); 
     } 

     _Random = new Random(); 
     _Minimum = min; 
     _Maximum = max; 
    } 

    public override string Next(IGenerationSession session) 
    { 
     var length = _Random.Next(_Minimum, _Maximum); 
     var sb = new StringBuilder(length); 

     for (int i = 0; i < length; i++) 
     { 
      var array = i % 2 == 0 ? _Consonants : _Vocals; 
      sb.Append(array[_Random.Next(array.Length)]); 
     } 

     return sb.ToString(); 
    } 
} 

public class DateTimeUniqueSource : DatasourceBase<DateTime> 
{ 
    private Random _Random; 
    private DateTime _LastDateTime; 

    public DateTimeUniqueSource() 
     : this(new DateTime(1900, 1, 1)) 
    { } 

    public DateTimeUniqueSource(DateTime startdate) 
    { 
     if (startdate == null) 
     { 
      throw new ArgumentNullException("startdate"); 
     } 

     _Random = new Random(); 
     _LastDateTime = startdate; 
    } 

    public override DateTime Next(IGenerationSession session) 
    { 
     _LastDateTime = _LastDateTime.AddHours(_Random.NextDouble() * 1000); 
     return _LastDateTime; 
    } 
} 

तो तुम प्रत्येक प्रकार के लिए अपने स्वयं के स्रोत बना सकते हैं और बाद में काफी आसान नमूना वस्तुओं का एक समूह बना सकते हैं।

1

आप 0 से enum आइटम गिनती से एक यादृच्छिक संख्या बना सकते हैं (आप उन्हें Enum.GetNames().Length तक प्राप्त कर सकते हैं), और फिर संख्या को अपने LogicalTypeEnum पर डालें।

1

आप निम्नलिखित कोड का टुकड़ा के साथ ऐसा कर सकता है:;)

var r = new Random(); 
int enumItemsCount = Enum.GetValues(typeof(LogicalTypeEnum)).Length; 
LogicalTypeEnum randomLogicalType = (LogicalTypeEnum)r.Next(enumItemsCount - 1); 
संबंधित मुद्दे