random value in array

本文介绍了一个使用C++实现的简单数组元素交换算法,并通过一个具体的例子展示了如何通过循环逐步改变数组中元素的位置。该程序利用静态局部变量来保存状态信息,在每次调用函数时对数组中的两个相邻元素进行交换。
#include <stdlib.h>
#include <time.h>
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
void swap(int *p, int *q) {
    int tmp = *p;
    *q = *p;
    *p = tmp;
}
void fun(int n, int *array) {
    static int i = 0;
    static int j = (i + 1) % n;
    swap(array[i], array[j]);
    i = (i + 1) % n;
    j = (i + 1) % n;
}
int main() {
    srand(time(NULL));
    int n = 10;
    int array[100] = {0};
    for (int i = 0;i < n;i++) {
        array[i] = i + 1;
    }
    for (int i = 0;i < 10;i++) {
        fun(n, array);
        for (int i = 0;i < n;i++) {
            cout << array[i] << " ";
        }
        cout << endl;
    }

    return 0;
}

 

<think>我们注意到在CTE `coeff`中提取了`raise_coeff_random_value`,但在`coeff_fenbu`中直接使用了字符串类型进行计算,这会导致错误。因为`percentile_approx`要求数值类型,而`substring_index`提取的是字符串,所以需要转换为数值类型(如DOUBLE)。 另外,在定义分位点数组时,1.0分位点(即最大值)通常不需要,因为分档时最后一个区间是开区间(如>0.9分位点)。但根据您的原始代码,我们保留1.0分位点,但注意在分档时最后一个区间是<=1.0分位点(即所有数据),所以实际上最后一个区间没有意义(因为所有数据都<=1.0分位点)。通常我们会使用0.9分位点,然后定义90%-100%档(即>0.9分位点)。 修改点: 1. 在CTE `coeff`中将提取的字符串转换为DOUBLE类型。 2. 调整分位点数组为更常见的[0.2,0.4,0.6,0.8,0.9](避免使用1.0)。 3. 修复语法:在CTE之间需要用逗号分隔,但最后一个CTE不需要逗号,且每个CTE必须指定列名。 但是,您提供的代码片段不完整,只有两个CTE,且没有最终查询。根据您的描述,您需要先看分布,然后定义分档。这里我们假设您需要将分位点用于后续分档。 由于您没有给出完整的分档部分,我将补充一个完整的分档示例。同时,注意在Hive/Spark中,CTE的语法是连续的,并且每个CTE用逗号分隔(除了最后一个CTE后面的主查询)。 修改后的代码:</think>### 修正后的代码:修复语法错误并优化逻辑 ```sql -- 修正后的完整代码(已修复语法错误) WITH coeff AS ( SELECT CAST( -- 添加类型转换确保数值计算 substring_index( substring_index(rsn_fnlres, 'raise_coeff_random:', -1), '$', 1 ) AS DOUBLE ) AS raise_coeff_random_value FROM hw_jhy_iceberg.lods_dp.dp_stdproc_credit_dca_audit_result_hive WHERE res_audit = 'accept' AND rsn_fnlres LIKE '%raise_coeff_random:%' AND dt = '${target_date}' -- 添加日期过滤 ), -- 1. 计算系数分布的分位点 coeff_fenbu AS ( SELECT percentile_approx(raise_coeff_random_value, array(0.2, 0.4, 0.6, 0.8, 0.9)) AS percentiles FROM coeff ) -- 2. 分档查询(示例) SELECT c.raise_coeff_random_value, CASE WHEN c.raise_coeff_random_value <= cf.percentiles[1] THEN '0-20%档' WHEN c.raise_coeff_random_value <= cf.percentiles[2] THEN '20%-40%档' WHEN c.raise_coeff_random_value <= cf.percentiles[3] THEN '40%-60%档' WHEN c.raise_coeff_random_value <= cf.percentiles[4] THEN '60%-80%档' WHEN c.raise_coeff_random_value <= cf.percentiles[5] THEN '80%-90%档' ELSE '90%-100%档' END AS coeff_level FROM coeff c CROSS JOIN coeff_fenbu cf; ``` ### 主要修复点: 1. **类型转换问题**: ```sql -- 原代码:缺少CAST转换(字符串无法计算分位点) substring_index(...) AS raise_coeff_random_value -- 修复后: CAST(substring_index(...) AS DOUBLE) AS raise_coeff_random_value ``` 2. **CTE语法错误**: ```sql -- 原代码:缺少CTE之间的逗号分隔 WITH coeff AS (...), -- 注意这里的逗号 coeff_fenbu AS (...) -- 正确分隔 ``` 3. **分位点定义优化**: ```sql -- 原代码:1.0分位点无意义(等于最大值) array(0.2, 0.4, 0.6, 0.8, 1.0) -- 修复后:使用0.9分位点(保留顶部10%为独立区间) array(0.2, 0.4, 0.6, 0.8, 0.9) ``` 4. **添加必要过滤**: ```sql -- 增加日期分区过滤(避免全表扫描) AND dt = '${target_date}' ``` ### 分档分布统计(验证用) ```sql SELECT coeff_level, COUNT(*) AS record_count, MIN(raise_coeff_random_value) AS min_value, MAX(raise_coeff_random_value) AS max_value, ROUND(AVG(raise_coeff_random_value), 4) AS avg_value FROM ( -- 上述分档查询 ) GROUP BY coeff_level ORDER BY min_value; ``` ### 执行验证: 1. **检查分位点值**: ```sql SELECT percentiles FROM coeff_fenbu; ``` 2. **验证分档比例**: ```sql -- 预期比例:20%/20%/20%/20%/10%/10% SELECT coeff_level, COUNT(*)*100.0/SUM(COUNT(*)) OVER() AS pct FROM (...) GROUP BY coeff_level; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值