C# 随机未获取其最大值

C# 随机未获取其最大值,c#,random,console,C#,Random,Console,我正在尝试创建一个控制台应用程序,它基本上是一些网站和银行等使用的安全措施的一个非常简单的版本 用户将声明一个存储在stringBuilder中的秘密字,之后,每次用户尝试访问程序/网站等时,他们必须输入通过随机密码生成的字X的字符X。但是,随机变量从不选择单词的最后一个字符 示例:当我使用2个字母的秘密单词时,它只会选择第一个字母,当我尝试使用其他方法让它选择字母时,它会认为有一个字母0会抛出整个应用程序 为什么最后一个角色从未被选中?请帮助新来的c 代码如下: using System; u

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

用户将声明一个存储在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();
                }
            }
        }

这是预期的行为。从:

返回值 类型:System.Int32

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

换句话说,如果您想要一个介于1和stringBuilder.Length之间的随机整数,即结果可能等于stringBuilder.Length,则需要使用:

int randomChar1 = rndSelect.Next(1, stringBuilder.Length + 1);
或者,您可以简单地修改代码以利用:


您的问题是Random.Nextint val1,int val2的第二个值是end exclusive。因此,您将不得不执行stringBuilder.Length+1


来源:

哦,我现在明白了,谢谢你这么多的作品,我知道我遗漏了一些东西:@KLM向用户显示的消息和用于在内部表示数据的值经常不同。就我个人而言,我更喜欢基于零的索引方法,因为C/.NET在本机上使用基于零的索引,我宁愿为了用户的利益而调整显示值。但这两种解决方案都是有效的。使用您觉得合适的选项。感谢您的回复,我知道为什么以零为基础更可取,并将相应地更正我的代码,谢谢您的输入。@p-s-w-g Yeah刚刚检查了代码并将其更改为以零为基础,看起来更干净,再次感谢您的输入。@KLM很高兴我能提供帮助。快乐编码:
int randomChar1 = rndSelect.Next(0, stringBuilder.Length);
...
if (userInput == (Convert.ToString(stringBuilder).Substring(randomChar1, 1)))
    Console.WriteLine("Correct!");