存储一个数字并在每次调用该方法时递增它

本文关键字:调用 方法 一个 数字 存储 | 更新日期: 2023-09-27 18:31:15

我正在尝试让我的扭曲方法执行以下操作:

存储数字(结果)
生成一个随机数并将其添加到结果
中到目前为止,我的代码是:

public int twist(int min, int max)
{
    int result = 0;
    Random random = new Random();
    int y = random.Next(min, max);
    result += y;
    System.Diagnostics.Debug.WriteLine(result);
    return result;
}

所做的只是每次生成一个新数字,因为我没有存储它,我认为我不需要循环,但我需要在每次 y 增量后存储结果,并且 y 应该只在每次调用 twist 方法时递增。

存储一个数字并在每次调用该方法时递增它

将"结果"存储在方法之外。我也倾向于使随机生成器成为静态的,并且它倾向于记住每次调用时生成的数字。

最好将 Random 保持静态,因为正如 Marc Gravell 所说:"每次你做新的 Random() 时,它都是使用时钟初始化的。这意味着在紧密循环中,您可以多次获得相同的值。您应该保留一个随机实例,并在同一实例上继续使用 Next。

查看 - 随机数生成器仅生成一个随机数以获取更多信息和报价来源。

private int _result = 0;
private static Random _rand = new Random();
public int twist(int min, int max)
{
    int y = _rand.Next(min, max);
    _result += y;
    System.Diagnostics.Debug.WriteLine(_result);
    return _result;
}

尝试:

private int result;
private Random random = new Random();
public int twist(int min, int max)
{
    int y = random.Next(min, max);
    result += y;
    System.Diagnostics.Debug.WriteLine(result);
    return result;
}

由于result需要通过对同一方法的多次调用来访问,因此需要将其放入字段而不是变量中。在您的版本中,每次调用twist都会创建一个新变量并将其设置为 0。如果将其提取到字段中,则在创建对象时将其初始化为 0,并且每次调用 twist 都会递增它,而不会每次重置它。

private static int result = 0;
private static Random random = new Random();
public int twist(int min, int max)
{
    int y = random.Next(min, max);
    result += y;
    System.Diagnostics.Debug.WriteLine(result);
    return result;
}

基本上,您需要在方法外部声明result,这样就不会每次都创建它并将其设置为零。

注意:如果您正在使用.aspx.cs文件,则可能还需要将其声明为static(或会话变量),否则它将在网页上发生的每个操作时重置。

注意 2:随机是静态的,因为每个实例都取决于系统时钟,因此您只有一个实例并在该实例上调用 .Next(min, max) 以获取另一个随机数。

这是一个简洁的小方法,只要您迭代IEnumerable,它就会返回任意数量的随机数的总和。

public IEnumerable<int> Twist(int min, int max)  {
  Random random = new Random();
  int result = 0;
  while (true) {
    result += random.Next(min, max);  // overflow pretty likely for large max
    System.Diagnostics.Debug.WriteLine(result);
    yield return result;
  }
}
// For a single element
int oneResult = Twist(1, 5).First();
// For the fifth
int fifth = Twist(1, 5).Skip(4).First();

如果你想推迟迭代,只是为了踢,给自己定义一个很好的扩展方法:

public static class EnumeratorExt {
    public static T Next<T> (this IEnumerator<T> seq) {
        if (seq.MoveNext()) {
            return seq.Current;
        }
        return default(T);
    }
}
// Now call it like so!
using (var generator = Twist(5, 10).GetEnumerator()) {
    Console.WriteLine(generator.Next());
    Console.WriteLine(generator.Next());
    Console.WriteLine(generator.Next());
    Console.WriteLine(generator.Next());
}

取决于你所说的"存储它"是什么意思。在哪里排序?全球?文件?数据库?我猜你的意思是全局,在这种情况下,在 twist 方法的范围之外声明你的结果变量