一个随机数组的算法问题

本文探讨了一种有效的数组随机排列算法。通过对比不同方法,最终采用了换位思想来避免重复生成随机数的问题,确保了数组元素的随机分布。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

去面试时有一个小算法题。感觉呢?还好吧,记录一下。问题,给一个数组,实现打乱数组的循序。如array={1,2,3,4,5,6,7,8,9,10,11,12,13……45},一个随机函数Random(45);

思考:就是随机生成45个不重复的随机数数组。代码如下

//防止重复
        TreeSet<Integer> treeSet = new TreeSet<>();
        for (int i = 0; i < array.length; i++) {
            int number = -1;
            number = getRandomNumber(array.length);
            if (treeSet.add(number)) {
                array[i] = number;
            } else {//重复了进行重新生成随机数
                do {
                    number = getRandomNumber(array.length);
                } while (!treeSet.add(number));
                array[i] = number;
            }
        }

        for (int v : array) {
            System.out.print(v + ", ");
        }

但是看到这个代码,感觉味道非常不好。感觉重复了。其实就是当没有重复的时候进行添加。于是改为如下:

        //防止重复
        TreeSet<Integer> treeSet = new TreeSet<>();
        for (int i = 0; i < array.length; i++) {
            int number = -1;
//            number = getRandomNumber(array.length);
//            if (treeSet.add(number)) {
//                array[i] = number;
//            } else {//重复了进行重新生成随机数
            do {
                number = getRandomNumber(array.length);
            } while (!treeSet.add(number));
            array[i] = number;
//            }
        }
        for (int v : array) {
            System.out.print(v + ", ");
        }

再度思考。其实,这个随机函数Random会不断调用。而且已经超过了数组的size的次数。如果出现糟糕的情况,不断生成同一个随机(一种可能),那么这个算法就是危险的了。所以推倒重来。采用换位的思想:如果随机到一个操作下标。就进行换位。代码如下

        for (int i = 0; i < array.length; i++) {
            Random random = new Random();
            //随机下标
            int index = random.nextInt(array.length);
            int move = array[i];

            array[i] = array[index];
            array[index] = move;
        }

        for (int v : array) {
            System.out.print(v + ", ");
        }

这样就简单多了。随机了size的数。而且达到了目的。

GraphCast是一种用于复杂网络数据分析的算法,通常用于预测动态系统中的数据传播。它并不直接应用于预测随机数组,因为它的核心应用是在社交网络、传感器网络等领域模拟信息流动。然而,如果你需要预测某种序列数据,比如时间序列数据中的随机数组,可能会将其视为一种图上信号处理的问题,通过构建节点间的连接(如依赖关系或相似度),然后利用类似PageRank的思想。 在Python中,虽然没有专门的`graphcast`库,你可以借助一些流行的数据科学库(如NetworkX + NumPy)来实现简单的模拟。首先,你需要定义一个图结构,其中数组元素作为节点,它们之间的联系(例如数值关联、位置邻接等)作为边。然后,可以使用扩散过程(如随机游走或基于概率的迭代)来模拟数据在图上的传播,最终得到一个预测结果。 以下是一个非常简化的例子: ```python import numpy as np import networkx as nx # 假设我们有一个随机数组 random_array = np.random.rand(10) # 构建一个简单图,这里假设数组下标相邻的元素有较高的关联性 G = nx.Graph() for i in range(len(random_array) - 1): G.add_edge(i, i+1) # 使用GraphCast或类似方法预测下一项 def graph_cast(G, start_node, num_iterations): # ... 实现一个扩散函数,例如随机选择下一个邻居节点 pred_values = [random_array[start_node]] for _ in range(num_iterations): next_value = np.random.choice(G.neighbors(pred_values[-1])) pred_values.append(random_array[next_value]) return pred_values[-1] # 预测数组的最后一个元素 predicted_last_element = graph_cast(G, 0, num_iterations=10) ``` 注意,这只是一个基础示例,并未真正实现GraphCast算法,实际操作可能需要更复杂的模型和算法调整。此外,如果随机数组不存在明确的结构,上述方法的效果将大打折扣。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值