从任意数量的数组生成随机值

本文关键字:随机 数组 任意数 | 更新日期: 2023-09-27 17:49:55

我有这样一个简单的代码来生成一个游戏中的角色。

string[] sex = new string[] { "Man", "Woman" };
string[] age = new string[] { "Child", "Teen", "Young", "Middle-aged", "Elderly", "Old" };
string[] beauty = new string[] { "Beautiful", "Pretty", "Normal", "Plain", "Ugly" };
Random i = new Random();
string sexR = sex[i.Next(0, sex.Length)];
string ageR = age[i.Next(0, age.Length)];
string beautyR = beauty[i.Next(0, beauty.Length)];
Console.WriteLine("{0} {1} {2}", sexR, ageR, beautyR);

虽然我只有三行,但没关系。但我想在未来有更多的性格特征。我怎么能使一个函数,将产生随机值从任何数量的数组我创建在我的程序?

从任意数量的数组生成随机值

您可以创建数组列表并遍历这些数组,分别存储每个属性并使用stringbuilder输出结果。

List<string[]> traits = new List<string[]> 
{
    new string[] { "Man", "Woman" },
    new string[] { "Child", "Teen", "Young", "Middle-aged", "Elderly", "Old" },
    new string[] { "Beautiful", "Pretty", "Normal", "Plain", "Ugly" }
};
Random i = new Random();
StringBuilder traitOutput = new StringBuilder();
foreach (string[] trait in traits)
{
    traitOutput.AppendFormat("{0} ", trait[i.Next(0, trait.Length)]);
}
Console.WriteLine(traitOutput);

如果您希望能够获得任意数量的列表的值,而不仅仅是一个列表的值,那么编写一个接受列表集合的方法,并从每个列表中随机选择一个项:

public static IEnumerable<T> ChooseFromAll<T>(
    IEnumerable<IList<T>> lists,
    Random generator)
{
    foreach (var list in lists)
        yield return list[generator.Next(list.Count)];
}

我想我们可以先讨论一下您用例中更清晰的代码。你显然是在创建某种人,让我们用一个person类来表示它。我们有一个相当复杂的创建场景,我们可以把它放在构造函数中,但我认为最好的方法是为它创建一个工厂类。

考虑到这一点,我们可以使用像GetRandomElement这样的技巧来简化语法。然而,我认为我们不需要进一步概括。我不热衷于通过属性或类似的东西进行挖掘,我认为保持可能值的数组不同更具有声明性。

public class Person{
    public string Sex { get;set;}
    public string Age {get;set;}
    public string Beauty { get;set;}    
}
public class RandomPersonFactory{
    private Random random;
    private string[] SexChoices = new[] { "Man", "Woman" };
    private string[] AgeChoices = new[] { "Child", "Teen", "Young", "Middle-aged", "Elderly", "Old" };
    private string[] BeautyChoices = new[] { "Beautiful", "Pretty", "Normal", "Plain", "Ugly" };
    public RandomPersonFactory(Random random){
        this.random = random;
    }
    public Person CreatePerson(){
        return new Person {
            Sex = GetRandomElement(this.SexChoices),
            Age = GetRandomElement(this.AgeChoices),
            Beauty = GetRandomElement(this.BeautyChoices)
        };
    }
    private T GetRandomElement<T>(T[] array){
        return array[this.random.Next(array.Length)];
    }
}

你可以这样组织你的代码;但如果你不是真正地在运行时改变个体特征的数量和类型,那就是不必要的复杂性和误导。问问你自己,你是否可以拥有一个没有性别特征或年龄特征的人。在这种情况下,我将以类似的方式编写工厂,但我将在CreatePerson方法中每次创建一个特征集合,然后创建具有该集合的人。

public class Person2{
   public IList<Trait> Traits {get;set;}
}
public class Trait{
    public string Name {get;set;}
    public string Value {get;set;}
}