【问题标题】:Random not getting its max value随机没有得到它的最大值
【发布时间】:2014-09-16 01:43:32
【问题描述】:

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

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

示例:当我使用 2 个字母的 Secret word 时,它只会选择第一个字母,当我尝试通过其他方法让它选择字母时,它认为有一个字母 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();
                }
            }
        }

【问题讨论】:

    标签: c# random console


    【解决方案1】:

    这是预期的行为。来自documentation

    返回值
    类型:System.Int32

    大于或等于minValue小于maxValue的32位有符号整数;即返回值的范围包括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!");
    

    【讨论】:

    • 哦,我现在明白了,非常感谢像魅力一样的作品,知道我错过了什么:)
    • @KLM 您向用户显示的消息和用于在内部表示数据的值经常不同。就个人而言,我更喜欢从零开始的索引方法,因为 C#/.NET 本身就使用从零开始的索引,我宁愿调整显示值只是为了用户的利益。但两种解决方案都是有效的。使用你觉得更舒服的那个。
    • 感谢您的回复,我明白为什么从零开始更可取,并将相应地更正我的代码,谢谢您的意见。
    • @p-s-w-g 是的,刚刚检查了代码并将其更改为从零开始,看起来更干净,再次感谢您的输入。
    • @KLM 很高兴我能提供帮助。快乐编码:)
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多