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

时间:2012-04-16 22:45:27

标签: c# random

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

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

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应该只增加每个调用扭曲方法的时间。

5 个答案:

答案 0 :(得分:3)

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

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

请查看 - Random number generator only generating one random number以获取更多信息和报价来源。

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;
}

答案 1 :(得分:2)

尝试:

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.如果将其提取到字段中,则在创建对象并且每次调用{{1}时将其初始化为0每次都不增加它而增加它。

答案 2 :(得分:1)

这是一个简洁的小方法,只要你迭代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());
}

答案 3 :(得分:1)

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(或会话变量),否则将在您网页上发生的每个操作中重置它。 / p>

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

答案 4 :(得分:0)

取决于“存储它”的含义。把它排序在哪里?全球?一份文件?一个数据库?我猜你的意思是全局,在这种情况下,将结果变量声明在扭曲方法的范围之外