非连续重复的整数数组
Posted
技术标签:
【中文标题】非连续重复的整数数组【英文标题】:Non-consecutively repeating array of integers 【发布时间】:2020-03-16 21:42:40 【问题描述】:我正在尝试生成一个。到目前为止,我所拥有的效果很好,只是它偶尔会生成一组双 0。我的问题是:
-
我怎样才能阻止它
必须有更好的方法来做到这一点,对吧?太丑了。
感谢您分享任何见解。
这是代码:
int[] randInts = new int[20];
Random rand = new Random();
for (int i = 0; i < 20; i++)
randInts[i] = rand.Next(0, 8);
for (int i = 1; i < 20; i++)
if (randInts[i] == randInts[i - 1] && randInts[i] < 8 && randInts[i] > 0)
randInts[i]--;
else if (randInts[i] == randInts[i - 1] && randInts[i] > 0)
randInts[i]++;
【问题讨论】:
【参考方案1】:public IEnumerable<int> NonConsecutiveRepeatingRandomValues(int upperBound)
Random rand = new Random();
int prev = -1;
while(true)
int value = prev;
while (value == prev)
value = rand.Next(upperBound);
yield return value;
然后为了得到正好 20 个值(而不是永远循环)这样调用它:
var randInts = NonConsecutiveRepeatingRandomValues(8).Take(20).ToArray();
但仅当您真的需要一个数组时才使用ToArray()
调用。如果没有它,您会感到惊讶。
【讨论】:
旁注:使用时不要忘记将rand
移出静态变量以避免相同的序列...
@AlexeiLevenkov 这是 VB.Net 实际上做得更好的少数几件事之一...... VB 有 Shared
而不是 static
,但也有一个 Static
关键字可以用来声明方法中的一个变量来获得这种确切的行为(它甚至是线程安全的)。值得庆幸的是,这个问题的方法应该是相当安全的,因为它对整个序列使用相同的实例——但理想情况下,是的,你会保持更长时间。或者,更好的是,使用加密 PRNG。
上限实际上是value = rand.Next(upperBound);
中的upperBound - 1
。应该记录在案:)【参考方案2】:
当你掷出与上次相同的数字时,你就再掷一次怎么样?
int[] randInts = new int[20];
Random rand = new Random();
int lastVal = -1;
int val = -1;
for (int i = 0; i < 20; i++)
while (val == lastVal)
val = rand.Next(0, 8);
randInts[i] = val;
lastVal = val;
当然,您会生成比您需要的更多的随机数,但性能损失不会很大。
【讨论】:
以上是关于非连续重复的整数数组的主要内容,如果未能解决你的问题,请参考以下文章
给定一个整数数组,其中一些数字重复1次或2次但一次重复3次,你如何找到它?