回答
Array values = Enum.GetValues(typeof(Bar));
Random random = new Random();
Bar randomBar = (Bar)values.GetValue(random.Next(values.Length));
使用Enum.GetValues到检索所有值的数组。然后选择一个随机数组项。
static T RandomEnumValue<T>()
{
var v = Enum.GetValues (typeof (T));
return (T) v.GetValue (new Random().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
更新:这个答案原本是用来OrderBy (x => _Random.Next()).FirstOrDefault()
选择一个随机元素。只有在你被不合理的吸引以随机键洗牌时才使用它。在任何其他情况下,请使用Darin Dimitrov接受的答案,而后将其纳入此答案中。
致电Enum.GetValues
;这将返回一个数组,该数组代表您的枚举的所有可能值。从这个数组中选择一个随机项目。将该项目转换回原始的枚举类型。
这是一个通用函数。 保持RNG创建在高频代码之外。
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>();
有一个不是线程安全的静态方法是非常危险的。 – CodesInChaos 2015-07-30 12:45:55
@CodesInChaos你说得对。 Random.Next()不是线程安全的,当它中断时将开始返回零。我已根据此信息更新了我的答案。 – WHol 2015-08-04 15:23:52
个人而言,我的扩展方法球迷,所以我会用这样的事情(而不是一个真正的延伸,它看起来类似):
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);
}
}
}
下面是使用LINQ
的替代版本Extension Method
。
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());
}
}
}
两个
一个
四
四
四
三
二
四
一个
三
你可能只是这样做:
var rnd = new Random();
return (MyEnum) rnd.Next(Enum.GetNames(typeof(MyEnum)).Length);
无需存储阵列
'GetNames'返回一个数组。 – 2017-06-13 15:21:01
我的意思是说你不需要存储它。我的错 – 2017-06-13 16:35:08
- 1. Java:从枚举中选择一个随机值?
- 2. 如何在Swift中随机选择一个枚举
- 3. 随机的值从枚举的概率
- 4. 选择枚举值
- 5. 如何从scala中的枚举中有效地选择一个随机元素?
- 6. SQL从枚举类型中挑选随机值
- 7. 斯威夫特:选择了一个随机枚举值
- 8. 选择从枚举
- 9. 从Python中选择枚举
- 10. 来自任何枚举的随机值
- 11. 如何选择下一个枚举值?
- 12. XSD如何选择多个枚举值
- 13. 如何绑定MVC3中的枚举值以选择正确的枚举值?
- 14. 如何从MySQL表中选择多个枚举值?
- 15. 随机枚举生成
- 16. 生成随机枚举
- 17. 从选定组中获取随机枚举
- 18. 从JavaScript对象中随机选择值
- 19. jsf selectonemenu从枚举中选择项目
- 20. 如何从jquery的数组值100中选择随机5值?
- 21. 你如何创建一个随机值的枚举?
- 22. 从WHILE中随机选择
- 23. 如何从一组随机数中进行随机选择?
- 24. 如何从mysql表中随机选择或随机播放它?
- 25. 在Java中将枚举值设置为随机值
- 26. 如何从TestComplete中的数组中选择一个随机值?
- 27. 如何从PHP中的数组中选择随机值?
- 28. PHP + SQL查询:选择枚举值
- 29. 序言:如何从一组随机数中选择最大值
- 30. 如何从相乘结果中选择随机唯一值
确保你不保持再造'在紧密循环random'虽然 - 否则,你将继续得到同样的值。 – ChrisF 2010-06-28 12:06:38
应该是random.Next(values.Length -1)? – uriDium 2013-04-26 14:48:07
@uriDium否,参数指定哪个值第一个太大而无法返回(即,_max减1_) – mafu 2013-09-11 10:50:56