সি # এ র্যান্ডম তারিখ


141

আমি 1 জানুয়ারী 1995 থেকে বর্তমান তারিখের মধ্যে একটি এলোমেলো তারিখ উত্পন্ন করতে কিছু সংক্ষিপ্ত, আধুনিক সি # কোড সন্ধান করছি।

আমি এমন কিছু সমাধান বিবেচনা করছি যা গণনাযোগ্যকে কাজে লাগায় an


পরিসরের মধ্যে র‌্যান্ডম ডেটটাইম-এর উত্তর - ইউনিফাইড নয় আউটপুট থেকে / তারিখের প্যারামিটারগুলির সাহায্যকারী পদ্ধতি রয়েছে
মাইকেল ফ্রেইজিম

উত্তর:


241
private Random gen = new Random();
DateTime RandomDay()
{
    DateTime start = new DateTime(1995, 1, 1);
    int range = (DateTime.Today - start).Days;           
    return start.AddDays(gen.Next(range));
}

আরও ভাল পারফরম্যান্সের জন্য যদি এটি বারবার বলা হয়, ফাংশনের বাইরেstart এবং gen(এবং এমনকি এমনকি range) ভেরিয়েবলগুলি তৈরি করুন।


1
র্যান্ডম কেবল ছদ্ম-এলোমেলো। আপনার যদি সত্যই এলোমেলো প্রয়োজন হয়, সিস্টেম থেকে আরএনজিক্রিপ্টোসোসাইভারপ্রোভিডার ব্যবহার করে দেখুন ecসিকিউরিটি Cক্রিপোগ্রাফি নেমস্পেস।
tvanfosson

ধন্যবাদ টভানফসন সিউডো-এলোমেলো এই সমস্যার জন্য যথেষ্ট।
এহুদা গ্যাব্রিয়েল হিমাঙ্গো

5
আসলে, এলোমেলো এমনকি বিশেষত ছদ্ম-এলোমেলো নয় যদি না আপনি উদাহরণটি কিছুক্ষণের জন্য রাখেন এবং এর থেকে মানগুলি অবিরত রাখেন।
ডেভিড মিচেল

2
এই কারণেই এটি উত্পাদন কোডের চেয়ে কেবলমাত্র একটি নমুনা।
জোয়েল কোহোর্ন

1
হ্যাঁ, এটি আমার পক্ষে কাজ করে; আমার রিয়েল-ওয়ার্ল্ড কোডটিতে পদ্ধতির বাইরে এলোমেলো উদাহরণ থাকবে।
এহুদা গ্যাব্রিয়েল হিমাঙ্গো

25

এটি কিছুটা আরও অনুকূলিত সংস্করণ তৈরি করার বিষয়ে জোয়েলের মন্তব্যের সামান্য প্রতিক্রিয়া। সরাসরি এলোমেলো তারিখ ফিরিয়ে দেওয়ার পরিবর্তে, কেন এমন কোনও জেনারেটরের ফাংশন ফিরিয়ে আনবেন না যা এলোমেলো তারিখ তৈরি করতে বারবার বলা যেতে পারে।

Func<DateTime> RandomDayFunc()
{
    DateTime start = new DateTime(1995, 1, 1); 
    Random gen = new Random(); 
    int range = ((TimeSpan)(DateTime.Today - start)).Days; 
    return () => start.AddDays(gen.Next(range));
}

এটি কীভাবে উপকারী তা আপনি ব্যাখ্যা করতে পারেন? পরিবর্তে, জেন, এবং পরিসীমা শ্রেণীর সদস্য হতে পারে না?
মার্ক এ। নিকোলোসি

তারা পারে এবং এই ক্ষেত্রে তারা হয়। হুডের নীচে এটি একটি লেজিকাল ক্লোজার তৈরি করবে যা একটি ক্লার্স যা সদস্য হিসাবে শুরু, জেন এবং ব্যাপ্তি সহ থাকে। এটি আরও সংক্ষিপ্ত।
জারেডপাড়

চমৎকার ফাংশন, আমি কেবল আশা করছি যে এটি কেউ এটিকে ব্যবহার করবে না:for (int i = 0; i < 100; i++) { array[i].DateProp = RandomDayFunc()(); }
এডিয়াপকি

2
এই ফাংশনটি কীভাবে ব্যবহৃত হয়, কেউ দয়া করে ব্যাখ্যা করতে পারেন? মানে আমি এটাকে কীভাবে ডাকব?
বুরাক করাকুş

2
@ বুড়াকড়াকুş: আপনি প্রথমে একটি কারখানা পাবেন: var getRandomDate = RandomDayFunc();তারপরে আপনি এলোমেলো তারিখগুলি পেতে কল করুন: var randomDate = getRandomDate();মনে রাখবেন যে জোয়েলের উত্তরের চেয়ে আরও দরকারী হওয়ার জন্য আপনাকে getRandomDate পুনরায় ব্যবহার করতে হবে।
akafak Gür

8

আমি @ জোয়েল কোহুর্নের উত্তর নিয়েছি এবং তার পরামর্শ অনুসারে পরিবর্তনগুলি করেছি - ভেরিয়েবলটি পদ্ধতিটি বাদ দিয়ে সমস্ত কিছু ক্লাসে রেখেছি। প্লাস এখন সময়ও এলোমেলো। ফলাফল এখানে।

class RandomDateTime
{
    DateTime start;
    Random gen;
    int range;

    public RandomDateTime()
    {
        start = new DateTime(1995, 1, 1);
        gen = new Random();
        range = (DateTime.Today - start).Days;
    }

    public DateTime Next()
    {
        return start.AddDays(gen.Next(range)).AddHours(gen.Next(0,24)).AddMinutes(gen.Next(0,60)).AddSeconds(gen.Next(0,60));
    }
}

এবং উদাহরণস্বরূপ কনসোলে 100 র্যান্ডম ডেটটাইম লিখতে কীভাবে ব্যবহার করবেন:

RandomDateTime date = new RandomDateTime();
for (int i = 0; i < 100; i++)
{
    Console.WriteLine(date.Next());
}

আপনি কেন দুবার র‌্যান্ডম () তৈরি করবেন? একসময় ক্লাস ভেরিয়েবল জেন ডিক্লেয়ারেশন এবং অন্য সময় সি-টরে?
পিক্সেল

হ্যাঁ, একবারে যথেষ্ট। আমি এটা ঠিক করেছি.
প্রাক

1
এটা তোলে সেকেন্ডের কেবলমাত্র একটি র্যান্ডম সংখ্যা তৈরী করা এবং আপনার শুরুর তারিখ থেকে যে যোগ করার জন্য চারবার দ্রুত সম্বন্ধে: range = (int)(DateTime.Today - start).TotalSeconds;এবং return start.AddSeconds(gen.Next(range));
জুরজি

5

ঠিক আছে, আপনি যদি বিকল্প অপ্টিমাইজেশন উপস্থাপন করেন তবে আমরা একটি পুনরাবৃত্তিকারীর জন্যও যেতে পারি:

 static IEnumerable<DateTime> RandomDay()
 {
    DateTime start = new DateTime(1995, 1, 1);
    Random gen = new Random();
    int range = ((TimeSpan)(DateTime.Today - start)).Days;
    while (true)
        yield return  start.AddDays(gen.Next(range));        
}

আপনি এটি এর মতো ব্যবহার করতে পারেন:

int i=0;
foreach(DateTime dt in RandomDay())
{
    Console.WriteLine(dt);
    if (++i == 10)
        break;
}

1
একটি পুনরুক্তি বনাম একটি জেনারেটরের ফাংশনের মধ্যে বিবেচনা করার একটি বিষয় হ'ল পুনরুক্তি সমাধানটি একটি আইডিসপোজেবল মান তৈরি করবে। এটি কলিকে জিসিতে চূড়ান্তরূপে সরাসরি থাকার মূল্য নিষ্পত্তি করতে বা মূল্য দিতে বাধ্য করে। জেনারেটরের কোনও নিষ্পত্তি করার দরকার নেই
জারেডপাড়

2
@ জারেডপার, এটি একদম ঠিক নেই। কোনও প্রকার আইডিস্পোজেবল বাস্তবায়িত করার অর্থ এটি চূড়ান্তযোগ্য নয়।
ড্রয় নোকস

3

একটি স্থির তারিখ অবজেক্ট (জানুয়ারী 1, 1995) দিয়ে শুরু করুন এবং অ্যাডডেসের সাথে এলোমেলো সংখ্যক দিন যুক্ত করুন (অবরুদ্ধভাবে, বর্তমান তারিখকে অতিক্রম না করে মনোযোগ দিন)।


ধন্যবাদ ফ্রিওল আমি জিজ্ঞাসা করছিলাম কীভাবে এলোমেলোভাবে পাস করা নম্বরটি সীমাবদ্ধ করবেন। জোয়েল কোড নমুনা সহ একটি উদাহরণ পোস্ট করেছেন, তাই আমি তার প্রতিক্রিয়াটিকে উত্তর হিসাবে চিহ্নিত করব।
এহুদা গ্যাব্রিয়েল হিমাঙ্গো

0

গেমটি থেকে আমি কিছুটা দেরি করেছি, তবে এখানে একটি সমাধান রয়েছে যা ভাল কাজ করে:

    void Main()
    {
        var dateResult = GetRandomDates(new DateTime(1995, 1, 1), DateTime.UtcNow, 100);
        foreach (var r in dateResult)
            Console.WriteLine(r);
    }

    public static IList<DateTime> GetRandomDates(DateTime startDate, DateTime maxDate, int range)
    {
        var randomResult = GetRandomNumbers(range).ToArray();

        var calculationValue = maxDate.Subtract(startDate).TotalMinutes / int.MaxValue;
        var dateResults = randomResult.Select(s => startDate.AddMinutes(s * calculationValue)).ToList();
        return dateResults;
    }

    public static IEnumerable<int> GetRandomNumbers(int size)
    {
        var data = new byte[4];
        using (var rng = new System.Security.Cryptography.RNGCryptoServiceProvider(data))
        {
            for (int i = 0; i < size; i++)
            {
                rng.GetBytes(data);

                var value = BitConverter.ToInt32(data, 0);
                yield return value < 0 ? value * -1 : value;
            }
        }
    }

0

কিছু ছোট পদ্ধতি যা কিছু সাধারণ ইনপুট প্যারামিটারের ভিত্তিতে স্ট্রিং হিসাবে এলোমেলো তারিখ দেয়। উপরের উত্তরগুলি থেকে ভিন্নতার ভিত্তিতে নির্মিত:

public string RandomDate(int startYear = 1960, string outputDateFormat = "yyyy-MM-dd")
{
   DateTime start = new DateTime(startYear, 1, 1);
   Random gen = new Random(Guid.NewGuid().GetHashCode());
   int range = (DateTime.Today - start).Days;
   return start.AddDays(gen.Next(range)).ToString(outputDateFormat);
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.