如果已经制作了新的随机实例,那么可以参考旧的随机实例?

时间:2018-01-06 08:19:37

标签: c# random

所以我的一般问题是:有没有办法在声明一个新的随机实例后引用它?

首先,以下是我目前正在使用的代码。

这是我创建的列表:

        Random p1rnd = new Random();
        List<string> p1list = new List<string>();
        p1list.Add("A");
        p1list.Add("B");
        p1list.Add("C");
        p1list.Add("D");
        p1list.Add("E");
        p1list.Add("F");
        p1list.Add("G");
        p1list.Add("H");
        p1list.Add("I");
        p1list.Add("J");
        int p1r = p1rnd.Next(p1list.Count);

这是我使用该列表的代码块,也是我目前遇到的问题:

Console.WriteLine("\nWhat would you like to say?");
                    Console.Write("A. ");
                    p1r = p1rnd.Next(p1list.Count); //CHOICE A
                    Console.Write(p1list[p1r]);
                    Console.Write("B. ");
                    p1r = p1rnd.Next(p1list.Count); //CHOICE B
                    Console.Write(p1list[p1r]);
                    Console.Write("C. ");
                    p1r = p1rnd.Next(p1list.Count); //CHOICE C
                    Console.Write(p1list[p1r]);
                    p1choiceA = Console.ReadLine();

基本上,我计划使用if-else语句删除选项。但是,我不知道如何说出我的病情。

        if ( ) // SHOULD BE CHOICE A
        {
        p1list.Remove( )
        }
        else if ( ) // SHOULD BE CHOICE B
        {
        p1list.Remove( )
        }
        else if ( ) // SHOULD BE CHOICE C
        {
        p1list.Remove( )
        }

通常,我会使用p1list[p1r]。但是,鉴于我为每个人创建了新的随机实例,我不知道该放什么。我如何参考选择A和B中使用的实例?感谢。

1 个答案:

答案 0 :(得分:0)

如果我正确理解您的要求,您希望显示三个随机选择。用户可以选择一个,从列表中删除。然后他会看到另外三个选择:从原始列表中剩下的两个,再加上一个随机选择。这是对的吗?

我的建议:

首先,将列表排序为随机顺序。这使其他一切变得更容易。

//using System.Linq;
var sortedList = p1list.OrderBy( s => p1rnd.NextDouble() ).ToList();

现在列表已排序,选择三个问题非常简单。选择前三个!如果你需要知道你选择了哪些......他们是前三个。这满足了随机性和召回的要求。

组成一个列表以便向用户显示Zip()列表,其中包含一个包含选项标识符(字母A,B和C)的数组。

    var choiceLetters = new [] { "A", "B", "C" };

    var choiceStrings = choiceLetters.Zip
    (
        sortedList, 
        (a,b) => string.Format("{0}. {1}", a, b)
    );
    Console.WriteLine("What would you like to say?");
    foreach (var s in choiceStrings) 
    {
        Console.WriteLine(s);
    }

要删除一个,只需将其从sortedList中删除即可。

    var choiceLetter = Console.ReadLine();
    var choiceIndex = Array.IndexOf(choiceLetters, choiceLetter.ToUpper());
    if (choiceIndex == -1) break;  //User didn't pick A, B, or C

    sortedList.RemoveAt(choiceIndex);

完整的解决方案:

public static void Main()
{
    Random p1rnd = new Random();
    List<string> p1list = new List<string>
    {
        "These sentences make up the random list of choices.",
        "In your example you used single letters.",
        "That was kind of confusing.",
        "The user always sees A, B, and C.",
        "But not sentences 0, 1, and 2.",
        "I'll have a beer please."
    };

    var sortedList = p1list.OrderBy( s => p1rnd.NextDouble() ).ToList();

    var choiceLetters = new [] { "A", "B", "C" };

    while (true)
    {
        var choiceStrings = choiceLetters.Zip
        (
            sortedList, 
            (a,b) => string.Format("{0}. {1}", a, b)
        );

        Console.WriteLine("What would you like to say?");
        foreach (var s in choiceStrings) 
        {
            Console.WriteLine(s);
        }

        var choiceLetter = Console.ReadLine();
        var choiceIndex = Array.IndexOf(choiceLetters, choiceLetter.ToUpper());
        if (choiceIndex == -1) break;  //User didn't pick A, B, or C

        sortedList.RemoveAt(choiceIndex);
    }
}