C# 如何随机化数组项,然后按所需百分比裁剪数组

C# 如何随机化数组项,然后按所需百分比裁剪数组,c#,C#,将数组中的项随机化并删除随机项以达到所需数组长度的最佳方法是什么 假设我有一个包含100项的数组 首先,我想把它随机化 然后,我有3%的系数:10%,30%,60% 我想从原始数组中删除项目,这样我得到的新数组将是原始大小的60%(60个项目),然后是30%,然后是10%。随机化数组的最佳方法是使用。您可以就地执行此操作(即,洗牌现有数组)或创建一个包含随机顺序项的新集合 我可能会这样做,而不是对原始数组进行变异,然后使用和来获得洗牌数组所需的子序列。(如果您愿意,可以很容易地将此代码改为。)

将数组中的项随机化并删除随机项以达到所需数组长度的最佳方法是什么

假设我有一个包含100项的数组

首先,我想把它随机化

然后,我有3%的系数:10%,30%,60%


我想从原始数组中删除项目,这样我得到的新数组将是原始大小的60%(60个项目),然后是30%,然后是10%。

随机化数组的最佳方法是使用。您可以就地执行此操作(即,洗牌现有数组)或创建一个包含随机顺序项的新集合

我可能会这样做,而不是对原始数组进行变异,然后使用和来获得洗牌数组所需的子序列。(如果您愿意,可以很容易地将此代码改为。)


将数组随机化的最好方法是使用一个数组。您可以就地执行此操作(即,洗牌现有数组)或创建一个包含随机顺序项的新集合

我可能会这样做,而不是对原始数组进行变异,然后使用和来获得洗牌数组所需的子序列。(如果您愿意,可以很容易地将此代码改为。)


首先,不能从数组中删除项。数组的大小是在创建时确定的,之后再也不能更改。如果你想要一个更小的数组,你必须创建一个新的

您可以使用如下扩展来洗牌项目:

public static class IEnumerableExtensions {

  public static IEnumerable<T> Shuffle<T>(this IEnumerable<T> list, Random rnd) {
    List<T> items = new List<T>(list);
    for (int i = 0; i < items.Count; i++) {
      int pos = rnd.Next(i, items.Count);
      yield return items[pos];
      items[pos] = items[i];
    }
  }

}
公共静态类IEnumerableExtensions{
公共静态IEnumerable Shuffle(此IEnumerable列表,随机rnd){
列表项=新列表(列表);
对于(int i=0;i
我不太清楚你所说的系数是什么意思,但我猜你想在一个数组中得到前60%,然后在第二个数组中得到另外30%,然后在第三个数组中得到另外10%:

IEnumerable<int> shuffled = originalArray.Shuffle(new Random()).ToList();

int cnt60 = (int)Math.Round(originalArray.Length * 0.6);
int cnt30 = (int)Math.Round(originalArray.Length * 0.3);
int cnt10 = (int)Math.Round(originalArray.Length * 0.1);

int[] first60 = shuffled.Take(cnt60).ToArray();
int[] next30 = shuffled.Skip(cnt60).Take(cnt30).ToArray();
int[] next10 = shuffled.Skip(cnt60+cnt30).Take(cnt10).ToArray();
IEnumerable shuffled=originalArray.Shuffle(new Random()).ToList();
int cnt60=(int)数学圆(originalArray.Length*0.6);
int cnt30=(int)数学圆(originalArray.Length*0.3);
int cnt10=(int)数学圆(originalArray.Length*0.1);
int[]first60=shuffled.Take(cnt60.ToArray();
int[]next30=shuffled.Skip(cnt60.Take(cnt30.ToArray();
int[]next10=shuffled.Skip(cnt60+cnt30).Take(cnt10.ToArray();

首先,您不能从数组中删除项。数组的大小是在创建时确定的,之后再也不能更改。如果你想要一个更小的数组,你必须创建一个新的

您可以使用如下扩展来洗牌项目:

public static class IEnumerableExtensions {

  public static IEnumerable<T> Shuffle<T>(this IEnumerable<T> list, Random rnd) {
    List<T> items = new List<T>(list);
    for (int i = 0; i < items.Count; i++) {
      int pos = rnd.Next(i, items.Count);
      yield return items[pos];
      items[pos] = items[i];
    }
  }

}
公共静态类IEnumerableExtensions{
公共静态IEnumerable Shuffle(此IEnumerable列表,随机rnd){
列表项=新列表(列表);
对于(int i=0;i
我不太清楚你所说的系数是什么意思,但我猜你想在一个数组中得到前60%,然后在第二个数组中得到另外30%,然后在第三个数组中得到另外10%:

IEnumerable<int> shuffled = originalArray.Shuffle(new Random()).ToList();

int cnt60 = (int)Math.Round(originalArray.Length * 0.6);
int cnt30 = (int)Math.Round(originalArray.Length * 0.3);
int cnt10 = (int)Math.Round(originalArray.Length * 0.1);

int[] first60 = shuffled.Take(cnt60).ToArray();
int[] next30 = shuffled.Skip(cnt60).Take(cnt30).ToArray();
int[] next10 = shuffled.Skip(cnt60+cnt30).Take(cnt10).ToArray();
IEnumerable shuffled=originalArray.Shuffle(new Random()).ToList();
int cnt60=(int)数学圆(originalArray.Length*0.6);
int cnt30=(int)数学圆(originalArray.Length*0.3);
int cnt10=(int)数学圆(originalArray.Length*0.1);
int[]first60=shuffled.Take(cnt60.ToArray();
int[]next30=shuffled.Skip(cnt60.Take(cnt30.ToArray();
int[]next10=shuffled.Skip(cnt60+cnt30).Take(cnt10.ToArray();