Collectives™ on Stack Overflow
Find centralized, trusted content and collaborate around the technologies you use most.
Learn more about Collectives
Teams
Q&A for work
Connect and share knowledge within a single location that is structured and easy to search.
Learn more about Teams
–
–
–
–
Use Enum.GetValues to retrieve an array of all values. Then select a random array item.
static Random _R = new Random ();
static T RandomEnumValue<T> ()
var v = Enum.GetValues (typeof (T));
return (T) v.GetValue (_R.Next(v.Length));
Test:
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
–
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());
Three
Three
–
–
–
–
–
var values = Enum.GetValues(typeof(T));
return (T)values.GetValue(random.Next(values.Length));
Example of usage:
var random = new Random();
var myEnumRandom = random.NextEnum<MyEnum>();
The modern answer combining this answer and its comment:
public static class RandomExtensions
private static Random Random = new Random();
public static T GetRandom<T>() where T : struct, Enum
T[]? v = Enum.GetValues<T>();
return (T)v.GetValue(Random.Next(v.Length));
Keep the RNG creation outside the high frequency code.
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);
Usage example:
System.Windows.Forms.Keys randomKey = RandomEnum<System.Windows.Forms.Keys>();
–
A lot of these answers are pretty old and - correct me if I'm wrong - seem to work with some sketchy concepts like type erasure and dynamic type casting. However, as user Yarek T points out, there's no need for that with the generic overload of Enum.GetValues:
static Random random = new Random();
// Somewhat unintuitively, we need to constrain the type parameter to
// both struct *and* Enum - struct is required b/c the type can't be
// nullable, and Enum is required b/c GetValues expects an Enum type.
// You'd think that Enum itself would satisfy the non-nullable
// constraint, but alas, me compiler tells me otherwise - perhaps
// someone more knowledgeable can explain why this is in a comment?
static TEnum RandomEnumValue<TEnum>() where TEnum : struct, Enum
TEnum[] vals = Enum.GetValues<TEnum>();
return vals[random.Next(vals.Length)];
Or, like in borja garcia's answer, we can even write this as an extension of the random class
public static class RandomExtensions
public static TEnum NextEnumValue<TEnum>(this Random random)
where TEnum : struct, Enum
TEnum[] vals = Enum.GetValues<TEnum>();
return vals[random.Next(vals.Length)];
And we can run the same test from mafu's answer:
Random random = new Random();
for (int i = 0; i < 10; i++) {
var day = random.NextEnumValue<System.DayOfWeek>();
Console.WriteLine(day.ToString());
Potential output:
Thursday
Saturday
Sunday
Sunday
Sunday
Saturday
Wednesday
Monday
Wednesday
Thursday
Personally, I'm a fan of extension methods, so I would use something like this (while not really an extension, it looks similar):
public enum Options {
Zero,
Three,
Four,
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);
–
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);
But you should use a better randomizer like the one in this library of mine.
–
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.