我试图在C#中使用随机函数从数组addetailsID
中随机选择四个,这个数组有六个以上的元素。
我将这些随机挑选放入另一个数组strAdDetailsID
:
string[] strAdDetailsID = new string[4];
for (int i = 0; i < 4; i++)
{
Random random = new Random();
int index = random.Next(0, addetailsID.Length);
value = addetailsID[index].ToString();
strAdDetailsID[i] = value;
}
有时候,我从六个元素中得到两个相同的值。如何获取所有四个唯一值?
答案 0 :(得分:6)
您可能最好关闭shuffling数组,然后选择前4个元素。
答案 1 :(得分:5)
你可以用这种方法用LINQ来做。
List<string> list = new List<string>() { "There", "Are", "Many", "Elements", "To", "Arrays" };
foreach (var item in list.OrderBy(f => Guid.NewGuid()).Distinct().Take(4))
{
Console.WriteLine(item);
}
答案 2 :(得分:3)
您对Random random ...
的展示位置有疑问,但我相信您是以错误的方式进行攻击。
这可以通过随机排序来源和前4项来解决。
var result = addetails.OrderBy(x => Guid.NewGuid()).Take(4).ToArray();
假设addetails
的内容是唯一的(就像你暗示的那样),你总会得到4个唯一值。正确使用随机,仍然可以获得重复(因为它是随机)。
答案 3 :(得分:2)
将它们放入列表中,并在选择后从列表中删除所选元素。
答案 4 :(得分:2)
首先需要生成4个唯一索引,然后从源数组中提取随机值:
string[] addetailsID = new string[20]; // this is the array I want to index into
// generate the 4 unique indices into addetailsID
Random random = new Random();
List<int> indices = new List<int>();
while (indices.Count < 4)
{
int index = random.Next(0, addetailsID.Length);
if (indices.Count == 0 || !indices.Contains(index))
{
indices.Add(index);
}
}
// now get the 4 random values of interest
string[] strAdDetailsID = new string[4];
for (int i = 0; i < indices.Count; i++)
{
int randomIndex = indices[i];
strAdDetailsID[i] = addetailsID[randomIndex];
}
答案 5 :(得分:1)
以下算法运行良好,不需要额外的存储或预先混洗。它确实改变了源数组的顺序,所以如果这不可行,那么预先混洗的方法是最好的。
在伪代码中:
result = []
For i = 0 to numItemsRequired:
randomIndex = random number between i and source.length - 1
result.add(source[randomIndex])
swap(source[randomIndex], source[i])
在C#中:
string[] strAdDetailsID = new string[4];
Random rand = new Random();
for (int i = 0; i < 4; i++)
{
int randIndex = rand.Next(i, adDetailsID.Length);
strAddDetails[i] = adDetailsID[randIndex];
string temp = adDetailsID[randIndex];
adDetailsID[randIndex] = adDetailsID[i];
adDetails[i] = temp;
}
答案 6 :(得分:0)
那么,您应该逐个选择随机项目,而不是在选择下一个项目时考虑已经挑选的项目。这必须比洗牌更快。
如果源列表很小,您只需制作副本并从中删除所选项目即可。否则,你会这样:
(让n
为数组中的项目数)
i
n-1-size(S)
i
的每个索引(从最小索引开始!),添加一个到i
i
是一个选定的索引,将其添加到S
。答案 7 :(得分:0)
使用列表代替并删除已使用的每个项目:
List<string> addetailsID = new List<string>{"1","2","3","4","5","6"};
string[] strAdDetailsID = new string[4];
Random random = new Random();
for (int i = 0; i < 4; i++)
{
int index = random.Next(0, addetailsID.Count);
string value = addetailsID[index].ToString();
addetailsID.RemoveAt(index);
strAdDetailsID[i] = value;
}
strAdDetailsID.Dump();