算法 - 在 c# 中初始化随机数组



对于一些儿童游戏,我有一个布尔类型为 10 大小的数组。 我得到了一个介于 1 到 10 之间的随机数,我喜欢做的是仅以 TRUE 但以随机顺序初始化该数量的单元格。

例如,如果我的随机数是 4,我希望输出如下:

F T F F F T T F F T
T F F T T T F F F F

有没有一种简单的方法可以在 C# 中做到这一点?

请注意,我知道所有的语法(初始化一个数组,使用随机和所有(,我有一个问题,找不到一个简短的算法来做到这一点。

生成:

int length = 10;
int numberOfTrue = 4;
bool[] array = Enumerable
.Range(0, length)
.Select(index => index < numberOfTrue)
.ToArray();  

和洗牌(例如使用费舍尔-耶茨算法(:

Random random = new Random();
...
for (int i = array.Length - 1; i >= 1; --i) {
int from = random.Next(i + 1);
var h = array[i];
array[i] = array[from];
array[from] = h;
} 

就像在现实生活中一样,创建您想要的true数量,您需要的false数量,然后将它们放入袋子中并随机播放:

var random = new Random();
int numberOfTruths = 7;
int numberOfFalsehoods = 10 - numberOfTruths;
var truths = Enumerable.Repeat(true, numberOfTruths);
var falsehoods = Enumerable.Repeat(false, numberOfFalsehoods);
var arrayOfBools = truths.Concat(falsehoods).OrderBy(x => random.Next()).ToArray();

另一种解决方案,如果您不想使用列表。

var rndBoolArray = new bool[10];
Random rnd = new Random();
int rndTrueCount = rnd.Next(1, 10); // Generate random number for the amount of true values in the array
for(int i = 0; i < rndTrueCount; i++)
{
int rndIndex = rnd.Next(0, 9); // Generate random number for the index
if(rndBoolArray[rndIndex] == false) // If the value at this position is not already true
rndBoolArray[rndIndex] = true;
else
rndTrueCount++; // We have to do one more loop, if the value of the array at the random index was already true
}

最新更新