我正在尝试创建一个控制台应用程序,它基本上是一些网站和银行等使用的安全措施的非常简单的版本。
用户将声明一个" 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();
}
}
}
答案 0 :(得分:2)
这是预期的行为。来自documentation:
返回值
键入:System.Int3232位有符号整数,大于或等于 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