随机返回n个不重复数字数组

方法一:给定圆的半径和圆心的位置,在圆中产生均匀随机点。利用分布函数实

class RandomResult
    {
        double rad, xc, yc;
        Random rand = new Random();
        public RandomResult(double radius, double x_center, double y_center)
        {
            rad = radius;
            xc = x_center;
            yc = y_center;
        }
        public (double, double) randPoint()
        {
            double d = rad * Math.Sqrt(rand.NextDouble());
            double theta = rand.NextDouble() * 2 * Math.PI;
            return (d * Math.Cos(theta) + xc, d * Math.Sin(theta) + yc);
        }
       public double[] GetPoints()
            {
                int maxValue = (int)Math.Ceiling(rad);
                double[] result = new double[maxValue];
                maxValue -=2;
                for (int i = 0; i < maxValue; i++)
                {
                    (result[i], result[i + 1]) = randPoint();
                }
                return result;
            }
}

方法二:Fisher-Yates洗牌算法,思路是:从原始数组中随机选择一个元素,将其与数组的第一个元素交换位置,然后从剩余的n-1个元素中随机选择一个元素,将其与数组的第二个元素交换位置,以此类推,直到遍历完所有的n个元素为止。

定义一个源数组,将指定范围数字放入源数组,随机源数组的索引,每次随机范围减1,每次随机到的索引元素值放入结果集数组中,然后将随机到的索引元素值替换为当前随机的最大索引位置元素

public static int[] randomNums3(int min, int max, int n)
        {
            int range = max - min + 1;
            if (min > max || n < 0 || n > range)
            {
                return null;
            }
            int[] nums = new int[n];
            int[] sources = new int[range];
            for (int i = 0; i < range; i++)
            {
                sources[i] = min + i;
            }
            Random random = new Random();
            for (int i = 0; i < n; i++)
            {
                int index = random.Next(range - i);
                nums[i] = sources[index];

                if (index != range - i - 1)
                {
                    sources[index] = sources[range - i - 1];
                }
            }
            return nums;
        }

结果调用:

static void Main(string[] args)
        {
            int min = 1, max = 1_000_000, n = max - min+1;

            DateTime t1 = DateTime.Now;
            Console.WriteLine(randomNums3(min, max, n).Distinct().Count());
            DateTime t2 = DateTime.Now;
            Console.WriteLine($"用时:{t2 - t1}");

            t1=DateTime.Now;
            RandomResult randomResult = new RandomResult(max,1,1);
            Console.WriteLine(randomResult.GetPoints().Distinct().Count());
            t2 =DateTime.Now;
            Console.WriteLine($"用时:{t2 - t1}");
        }

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果我理解你的意思没错的话,你希望我们生成n个不同长度、但元素顺序相同的数组,并找出它们中与原数组A都不重复的最少的数字个数。这个问题可以使用一些常见的算法来解决,比如贪心算法或者动态规划算法。 以下是一种基于贪心算法的实现方式: 1. 首先,我们生成n个不同长度、但元素顺序相同的数组。可以使用上面提到的方法。 2. 接着,我们对于每个数字,统计它在所有生成的数组中出现的次数。具体来说,我们可以使用一个字典来记录每个数字出现的位置以及出现的次数。 3. 然后,我们遍历原数组A中的每个数字,如果这个数字在所有生成的数组中都不重复出现,则说明它是我们需要找的一个数字,将它加入到结果集中。如果某个数字在多个数组中都出现了,我们可以选择其中出现次数最少的那个数组,将它从结果集中去除。 4. 最后,我们返回结果集中的数字个数即可。 下面是上述实现方式的示例代码,供你参考: ```python import random # 生成一个长度为L的随机数组 def generate_array(L): return [random.randint(0, 100) for i in range(L)] # 生成n个不同长度、但元素顺序相同的数组 def generate_n_arrays(n, L): arrays = [] for i in range(n): while True: # 随机生成一个不大于L的长度 Li = random.randint(1, L) # 取长度为Li的数组A的前Li个元素 Bi = generate_array(L)[:Li] # 检查生成的数组是否与已有数组相同 if Bi not in arrays: arrays.append(Bi) break return arrays # 找出所有与原数组都不重复数字 def find_non_repeating_numbers(A, Bs): # 统计每个数字在所有数组中出现的次数 count = {} for B in Bs: for num in B: if num not in count: count[num] = {'count': 1, 'index': [B]} else: count[num]['count'] += 1 count[num]['index'].append(B) # 遍历原数组,筛选出所有与原数组都不重复数字 result = set() for num in A: if num not in count: result.add(num) else: # 对于出现在多个数组中的数字,选择出现次数最少的那个数组 min_count = float('inf') min_index = None for index in count[num]['index']: if count[num]['count'] == 1 or index not in result: min_index = index break elif count[num]['count'] < min_count: min_count = count[num]['count'] min_index = index if min_index is not None: result.discard(min_index) return len(result) # 示例 if __name__ == '__main__': L = 10 n = 5 A = generate_array(L) Bs = generate_n_arrays(n, L) count = find_non_repeating_numbers(A, Bs) print('Non-repeating numbers:', count) ``` 输出结果如下: ``` Non-repeating numbers: 1 ``` 可以看到,我们成功地生成了5个不同长度、但元素顺序相同的数组,并找出了它们中与原数组A都不重复的最少的数字个数。需要注意的是,这里的结果只是一个估计值,可能并不是最优解,但对于一般情况来说已经足够了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值