随机化一维数组

一 问题:假设有一个一维整型数组,随机化这个数组,即使得每个元素在数组中随机出现,且概率一样。

二 解题思路:

    1. 构造两个数组,一个辅助数组,用于哈希,另一个用于保留优先级。例如,输入一组数据2,1,0

那么,辅助数组为0,1,2,即首先随机生成一个3之内的整数,比如2,如果在2的位置没有元素,则放入,否则再次随机生成元素,直到辅助数组中所有元素都不相同,将这些都不相同的元素放入优先级数组。

2. 按照优先级,对原数组进行插入排序。

三 代码

/*************************************************************************
    > File Name: randomArray.c
    > Author: ma6174
    > Mail: ma6174@163.com 
    > Created Time: Mon 25 Aug 2014 09:44:03 PM CST
 ************************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>
#define random(m) (rand() % m)
#define N 10
int main() {
	srand((int)time(0));   // set the seed
	int array[N];          // input array
	int assist_array[N];
	int prority[N];       // indicate prority of every element in the array
	int e;
	int i, j;
	int tmp, tmp1;
	for(i = 0;i < N;i++) {
		assist_array[i] = -1;   // initialize
	}
	for(i = 0;i < N;i++) {
		scanf("%d", &array[i]);
	}
	for(i = 0;i < N;i++) {
		e = random(N);
		if(assist_array[e] == -1) {   // if the e is only one 
			assist_array[e] = e;
			prority[i] = e;        // put in the prority
		}
		else {
			i--;                 // game is continuing
		}
	}
	/*
	 * insert sort in terms of prority
	 * */
	for(i = 1;i < N;i++) {         
		tmp = prority[i];
		tmp1 = array[i];
		j = i - 1;
		while(j >= 0 && prority[j] > tmp) {
			array[j + 1] = array[j];
			j--;
		}
		array[j + 1] = tmp1;
	}
	printf("random the array is:\n");
	for(i = 0;i < N;i++) {
		printf("%d\n", array[i]);
	}

	return 0;
}


四 测试


<think>好的,我现在需要帮助用户解决如何在C++中生成一个包含随机数的一维数组的问题。首先,我要回顾一下用户提供的引用内容,看看是否有相关的示例或代码可以参考。 用户提到了引用[1]中的C++代码,其中使用了`<random>`头文件中的随机生成器类,包括`std::random_device`、`std::mt19937`和`std::uniform_real_distribution`来生成随机数。这段代码生成的是双精度浮点数,范围在-1.0到1.0之间。用户的需求是生成一维数组,可能需要整数或浮点数,但用户没有具体说明,可能需要进一步确认,不过根据示例,可能默认使用浮点数。 接下来,我需要考虑如何将这些随机数填充到数组中。用户的问题是一维数组,所以需要先创建数组,然后用循环填充随机数。在C++中,可以使用标准库中的`std::vector`或者原生数组。考虑到灵活性和安全性,推荐使用`std::vector`,因为它可以动态调整大小,并且管理内存更方便。 步骤分解: 1. 包含必要的头文件:`<random>`用于随机生成,`<vector>`用于使用`std::vector`,可能需要`<iostream>`来输出结果。 2. 初始化随机生成器,如示例中的`std::mt19937`引擎,用`std::random_device`来播种。 3. 定义分布,用户可能需要指定分布类型和范围。如果用户没有说明,可能需要选择常见的分布,比如均匀分布,范围假设为0到100之间的整数,或者0.0到1.0的浮点数。根据引用[1]的例子,用户可能想要浮点数,但原问题没有明确说明,可能需要提供两种选项。不过根据用户提供的示例代码,生成的是双精度浮点,但用户的问题可能更倾向于整数,需要进一步考虑。不过可能先按引用中的例子来处理,但需要明确说明如何调整类型和范围。 4. 创建一维数组(`std::vector`),并使用循环填充随机数。 5. 输出数组内容以验证结果。 此外,需要考虑代码的正确性和可移植性。例如,`std::random_device`在某些平台上可能不够随机,这时候可能需要使用其他种子方法,但在大多数情况下,示例代码是足够的。 用户可能还关心如何控制随机数的范围,比如生成整数还是浮点数,以及如何调整数组的大小。因此,在回答中应该提供可定制的代码,并解释各部分的作用,让用户可以自行修改参数,如数组大小、分布类型和范围。 另外,引用[3]中提到了使用OpenCV的`cv::RNG`类生成噪声,但用户的问题没有提到需要使用OpenCV,所以可能不需要涉及这部分。应专注于标准库的实现。 可能的代码结构: - 使用`std::vector<double>`或`std::vector<int>`作为数组类型。 - 使用循环填充每个元素。 - 示例输出显示生成的数组。 需要检查是否有语法错误,例如正确使用分布对象,引擎的初始化是否正确,以及是否正确处理了类型转换。 最后,生成相关问题,例如如何生成不同分布类型的随机数,如何生成多维数组,或者如何优化随机生成的性能等。</think>在C++中生成随机一维数组的步骤如下: ### 1. 完整代码实现 ```cpp #include <iostream> #include <random> #include <vector> int main() { // 初始化随机数引擎 std::random_device rd; std::mt19937 gen(rd()); // 设置分布范围(示例为0-100的整数) std::uniform_int_distribution<> dis(0, 100); // 创建包含20个元素的一维数组 std::vector<int> arr(20); // 填充随机数 for (auto& elem : arr) { elem = dis(gen); } // 输出结果 std::cout << "生成随机数组: "; for (const auto& elem : arr) { std::cout << elem << " "; } return 0; } ``` ### 2. 关键要素说明 1. **随机数引擎**:`std::mt19937`是高性能的梅森旋转算法引擎,配合`std::random_device`生成随机数种子[^1] 2. **分布类型**: - 整数分布:`std::uniform_int_distribution<>` - 浮点分布:`std::uniform_real_distribution<>` 3. **容器选择**:使用`std::vector`实现动态数组,比原生数组更安全灵活 4. **参数定制**:可修改`(0, 100)`调整范围,或替换为`(0.0, 1.0)`生成浮点数 ### 3. 不同需求变体 **生成浮点数组**: ```cpp std::uniform_real_distribution<> dis(0.0, 1.0); std::vector<double> arr(20); ``` **生成正态分布数组**: ```cpp std::normal_distribution<> dis(5.0, 2.0); // 均5,标准差2 ``` ### 4. 性能优化建议 - 提前预分配数组空间避免动态扩容 - 复用随机数引擎对象 - 多线程环境下应为每个线程创建独立引擎
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值