আমি একটি গণনা থেকে এলোমেলো মানটি কীভাবে নির্বাচন করব?


170

সি # তে একটি স্বেচ্ছাসেবী গণনা দেওয়া, আমি কীভাবে একটি এলোমেলো মান নির্বাচন করব?

(এসও-তে আমি এটি খুব বেসিক প্রশ্নটি পাইনি anyone আমি আমার উত্তর কারওর জন্য রেফারেন্স হিসাবে এক মিনিটের মধ্যে পোস্ট করব, তবে দয়া করে আপনার নিজের উত্তর পোস্ট করতে দ্বিধা বোধ করবেন))

উত্তর:


282
Array values = Enum.GetValues(typeof(Bar));
Random random = new Random();
Bar randomBar = (Bar)values.GetValue(random.Next(values.Length));

40
নিশ্চিত করুন যে আপনি randomযদিও টাইট লুপে পুনরায় পুনরুক্তি করবেন না - অন্যথায় আপনি একই মান পেতে থাকবেন।
ক্রিসএফ

1
এটি কি এলোমেলো হওয়া উচিত? পরবর্তী (মানগুলি। দৈর্ঘ্য -১)?
uriDium

7
@ ইউরিডিয়াম না, যুক্তিটি উল্লেখ করে যে কোন মানটি প্রথমে খুব বেশি বড় হবে (যা সর্বোচ্চ বিয়োগ 1 )
মাফু

মান। দৈর্ঘ্য - 1
বোজিদার স্টানচেভ

ডারিনডিমিট্রভ আইএমও @ ক্রিসএফের প্রথম মন্তব্যটি ক্রসের প্রতি কৃতিত্ব সহ উত্তরের ভিতরে একটি নোট হওয়া উচিত।
maytham-ɯɐɥʇʎɐɯ

60

সমস্ত মানের একটি অ্যারে পুনরুদ্ধার করতে এনাম.গ্যাটভ্যালু ব্যবহার করুন। তারপরে একটি এলোমেলো অ্যারে আইটেমটি নির্বাচন করুন।

static Random _R = new Random ();
static T RandomEnumValue<T> ()
{
    var v = Enum.GetValues (typeof (T));
    return (T) v.GetValue (_R.Next(v.Length));
}

টেস্ট:

for (int i = 0; i < 10; i++) {
    var value = RandomEnumValue<System.DayOfWeek> ();
    Console.WriteLine (value.ToString ());
}

->

Tuesday
Saturday
Wednesday
Monday
Friday
Saturday
Saturday
Saturday
Friday
Wednesday

5

আপনি কেবল এটি করতে পারেন:

var rnd = new Random();
return (MyEnum) rnd.Next(Enum.GetNames(typeof(MyEnum)).Length);

অ্যারে সঞ্চয় করার দরকার নেই


GetNamesএকটি অ্যারে প্রদান করে।
নাথান টগি

আমি বোঝাতে চাইছি এটি আপনার সঞ্চয় করার দরকার নেই। আমার খারাপ
ব্রেণো অ্যাঞ্জলটি

যদি কেউ লুপে এটি করে থাকে তবে তারা অ্যারেতে ক্যাশে করার পরিবর্তে প্রতিবারই গেটনামকে কল করবে। এটি তাদের কোডটি কমিয়ে দেবে তাই আমি দেখতে পাচ্ছি না এখানে আপনার অবদান কী?
বোজিদার স্টানচেভ

@ বোজিদার স্টাঞ্চেভ যদি আমার ক্ষেত্রে এটি দুর্দান্ত কাজ করে তবে আপনাকে ধন্যবাদ
ব্রেণো

3

এখানে Extension Methodব্যবহার হিসাবে একটি বিকল্প সংস্করণ LINQ

using System;
using System.Linq;

public static class EnumExtensions
{
    public static Enum GetRandomEnumValue(this Type t)
    {
        return Enum.GetValues(t)          // get values from Type provided
            .OfType<Enum>()               // casts to Enum
            .OrderBy(e => Guid.NewGuid()) // mess with order of results
            .FirstOrDefault();            // take first item in result
    }
}

public static class Program
{
    public enum SomeEnum
    {
        One = 1,
        Two = 2,
        Three = 3,
        Four = 4
    }

    public static void Main()
    {
        for(int i=0; i < 10; i++)
        {
            Console.WriteLine(typeof(SomeEnum).GetRandomEnumValue());
        }
    }           
}

দুই
এক
চার
চার
চার
তিন
দুই
চার
এক
তিন


2

কল Enum.GetValues; এটি এমন একটি অ্যারে প্রদান করে যা আপনার এনামের জন্য সমস্ত সম্ভাব্য মান উপস্থাপন করে। এই অ্যারে থেকে একটি এলোমেলো আইটেম চয়ন করুন। সেই আইটেমটি মূল এনাম টাইপটিতে কাস্ট করুন।


2

এখানে এটির জন্য একটি জেনেরিক ফাংশন। আরএনজি সৃষ্টি উচ্চ ফ্রিকোয়েন্সি কোডের বাইরে রাখুন।

public static Random RNG = new Random();

public static T RandomEnum<T>()
{  
    Type type = typeof(T);
    Array values = Enum.GetValues(type);
    lock(RNG)
    {
        object value= values.GetValue(RNG.Next(values.Length));
        return (T)Convert.ChangeType(value, type);
    }
}

ব্যবহারের উদাহরণ:

System.Windows.Forms.Keys randomKey = RandomEnum<System.Windows.Forms.Keys>();

থ্যাটাসেফ নয় এমন একটি স্থিতিশীল পদ্ধতি থাকা বিপজ্জনক।
কোডসইনচাউস

@ কোডসআইএনচাউস আপনি ঠিক বলেছেন র‌্যান্ডম.নেক্সট () থ্রেডসেফ নয় এবং ব্রেক হয়ে গেলে শূন্যগুলি ফিরিয়ে দেওয়া শুরু করবে। আমি এই তথ্যের উপর ভিত্তি করে আমার উত্তর আপডেট করেছি।
WHOL

1

ব্যক্তিগতভাবে, আমি এক্সটেনশন পদ্ধতির একটি অনুরাগী, তাই আমি এই জাতীয় কিছু ব্যবহার করব (যদিও এটি আসলে কোনও এক্সটেনশন নয়, এটি দেখতে একই রকম):

public enum Options {
    Zero,
    One,
    Two,
    Three,
    Four,
    Five
}

public static class RandomEnum {
    private static Random _Random = new Random(Environment.TickCount);

    public static T Of<T>() {
        if (!typeof(T).IsEnum)
            throw new InvalidOperationException("Must use Enum type");

        Array enumValues = Enum.GetValues(typeof(T));
        return (T)enumValues.GetValue(_Random.Next(enumValues.Length));
    }
}

[TestClass]
public class RandomTests {
    [TestMethod]
    public void TestMethod1() {
        Options option;
        for (int i = 0; i < 10; ++i) {
            option = RandomEnum.Of<Options>();
            Console.WriteLine(option);
        }
    }

}

1
সি # public static T Of<T>() where T : Enum .3.৩ অনুসারে
en-

0

একটি এলোমেলো শ্রেণির এক্সটেনশন হিসাবে অভিযোজিত:

public static class RandomExtensions
{   
    public static T NextEnum<T>(this Random random)
    {
        var values = Enum.GetValues(typeof(T));
        return (T)values.GetValue(random.Next(values.Length));
    }
}

ব্যবহারের উদাহরণ:

var random = new Random();
var myEnumRandom = random.NextEnum<MyEnum>();

0

আপনি এলোমেলো মানও দিতে পারেন:

using System;

enum Test {
  Value1,
  Value2,
  Value3
}

class Program {
  public static void Main (string[] args) {
    var max = Enum.GetValues(typeof(Test)).Length;
    var value = (Test)new Random().Next(0, max - 1);
    Console.WriteLine(value);
  }
}

তবে আপনার এই লাইব্রেরির মতো আরও ভাল র্যান্ডমাইজার ব্যবহার করা উচিত ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.