随机没有得到它的最大值

时间:2014-09-16 01:43:32

标签: c# random console

我正在尝试创建一个控制台应用程序,它基本上是一些网站和银行等使用的安全措施的非常简单的版本。

用户将声明一个" Secret Word"(存储在stringBuilder中),之后,每次用户尝试访问该程序/网站等时,他们必须输入该单词的字符X( X通过随机生成)。但是,随机从不选择单词的最后一个字符。

示例:当我使用2个字母的密码字时,它只会选择第一个字母,当我尝试通过其他方法选择字母时,它认为有一个字母0会抛出整个应用程序。

为什么最后一个角色永远不被选中?请帮忙(c#新手)

以下代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

       namespace randomCharSelecter
       {
            class Program
           {
                static void Main(string[] args)
                {
                    StringBuilder stringBuilder = new StringBuilder();

                    Console.WriteLine("Please Enter Your Secret Word");
                    stringBuilder.Append(Console.ReadLine());           


                    EnterInput:
                    Random rndSelect = new Random();
                    int randomChar1 = rndSelect.Next(1, (stringBuilder.Length));

                    Console.WriteLine("Please enter character {0} of your secret word", randomChar1);
                    string userInput = Console.ReadLine();

                    if (userInput == (Convert.ToString(stringBuilder).Substring(randomChar1 - 1, 1)))
                        Console.WriteLine("Correct!");
                    else
                    {
                        Console.WriteLine("Incorrect! Please try again");
                        goto EnterInput;
                    }

                    Console.ReadLine();
                }
            }
        }

2 个答案:

答案 0 :(得分:2)

这是预期的行为。来自documentation

  

返回值
  键入:System.Int32

     

32位有符号整数,大于或等于 minValue 小于 maxValue ;也就是说,返回值的范围包括 minValue ,但不包括 maxValue 。如果 minValue 等于 maxValue ,则返回 minValue

换句话说,如果你想要一个介于1和stringBuilder.Length之间的随机整数(也就是说,结果可能等于stringBuilder.Length),你需要使用:

int randomChar1 = rndSelect.Next(1, stringBuilder.Length + 1);

或者,您只需修改代码即可使用zero-based indexing

int randomChar1 = rndSelect.Next(0, stringBuilder.Length);
...
if (userInput == (Convert.ToString(stringBuilder).Substring(randomChar1, 1)))
    Console.WriteLine("Correct!");

答案 1 :(得分:0)

您的问题是Random.Next(int val1, int val2)的第二个值是结束独占。所以你最终不得不做stringBuilder.Length + 1

来源:http://msdn.microsoft.com/en-us/library/2dx6wyd4(v=vs.110).aspx