【问题标题】:How to create a random function that returns a different value every time? [closed]如何创建一个每次返回不同值的随机函数? [关闭]
【发布时间】:2012-05-09 01:18:46
【问题描述】:

我正在尝试编写一个 Random 函数,它返回一个随机数,它不同于它返回的最后 5 个不同的数字。

我在 excel VBA 中使用的非常相似的代码:

    Function Rand(ByVal Low As Long, ByVal High As Long) As Long
Randomize
    Num3 = Num2
    Num2 = Num1
  Rand = Int((High - Low + 1) * Rnd) + Low
  Num1 = Rand

 Do While Num1 = Num2 Or Num1 = Num3 Or Sheets(Csheet).Cells(Num1, 3) > 20

      Rand = Int((High - Low + 1) * Rnd) + Low
     Num1 = Rand
  Loop
End Function

该数字还需要检查 heb[i].Known 处的单词是否为假。 我试过这个:

private int Rand(int Min, int Max)
        {
            int i;
            int x = 0;
            Random rnd = new Random();
            oldNum[3] = oldNum[2];
            oldNum[2] = oldNum[1];
            oldNum[1] = oldNum[0];
            do
            {

                i = rnd.Next(Min, Max);
                x++;
            }
            while (Heb[i].Known==false && x<10000 && oldNum.Contains(i));
            oldNum[0] = i;
            return i;

        }

不过好像配合的不太好……每次都返回0。

Min 和 Max 是它随机化的列表中的范围(应该在 1 -30 之间) Heb 是列表中的项目数(大约 500 - 1000 项) 我初始化 oldNum:

  int[] oldNum = new int[3];

【问题讨论】:

  • Random() 类有什么问题?
  • 它做了什么你没想到的?
  • Ehm,如果每个数字都必须与前面的五个不同,那就不是应该的随机了!无论如何,每次您需要一个新的随机数时,您的示例都会为随机发生器播种,但效果不佳。将rnd 设为静态并仅调用Random 函数一次。
  • 每次都返回0。
  • Min 是什么,Max 是什么,Heb 有多大,Heb 中有没有真正的Known 值,你用什么初始化oldNum 等等.

标签: c# random while-loop


【解决方案1】:

听起来你需要Queue

Random rng = new Random();
Queue<int> queue = new Queue<int>();

private int Rand(int min, int max)
{
    int r;

    while(queue.Contains(r = rng.Next(min, max)));

    queue.Enqueue(r);

    if(queue.Count > 5) queue.Dequeue();

    return r;
}

【讨论】:

  • 或者一个简单的带有翻转索引的固定数组。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-29
  • 2020-01-10
  • 2020-10-17
  • 1970-01-01
  • 2023-01-14
  • 2012-09-17
  • 1970-01-01
相关资源
最近更新 更多