随机数表法题目(有一个20*20的数组,初值为0;现在要将20个非0数放在数组的任意20个位置上必须确保20个数都成功放入了)

本文目录
有一个20*20的数组,初值为0;现在要将20个非0数放在数组的任意20个位置上必须确保20个数都成功放入了
/*
这道题目本质上是产生一组不同的随机数。
产生不同随机数我所用过的方法:
1. 每产生一个随机数便与已有随机数相比较, 如果相同, 则再产生一个,
这种方法在实际中可行, 但理论上并不是很能让人接受, 比如:我产生两个不同的随机数, 可能执行效率很高(因为在[0, RAND_MAX)范围内两次产生两个相同的随机数的概率很低), 假设有一种很坏的情况, 比如: 我想要产生398个400以内的随机数, 这种方法就不能接受了。
2. 现在来说, 目前我感觉比较好的第二种方法:
比如, 我要产生10个100以内的不同随机数, 那么可不可以这样考虑,
我先定义一个int arr,每个元素取值从1一直到100(1、2、3、……98、99、100)
int arr;
for (i = 0; i 《 100; i++) {
arr = i+1;
}
这个数组是有序的, 那么现在我随机打乱这个数组中数的顺序, 具体打乱方法:
int temp;
int random_index;
for (i = 0; i 《 100; i++) {
random_index = rand() % 100;
temp = arr;
arr;
arr = t;
}
上面算法很简单, 首先随机产生一个数组元素索引, 然后让这个元素和当前元素交换,
这样经过100次循环后, 数组中的元素就杂乱无章了。
下面讲上述算法怎么应用到这道题目中:
如果我要随机设置30*30的二维数组中20个元素为非0, 那么我需要得到20组随机的二维数组元素下标, 但是直接这样操作有点难度, 但是产生20个不同的随机数则很简单(用第二种算法)
下面我们这样做:
int num_box;
int index_box;
int i;
for (i = 0; i 《 900; i++) {
index_box = i;
}
然后用上面算法打乱这900个数的顺序使其排序随机化
由于我们只需要得到30个不同的数, 而index_box中900个数是随机排列的, 所以为了得到30个不同的随机数, 无论取index_box中的哪30个数都一样,所以我们只取数组的前30个数。
假设我们得到的30个数是225、303、17、……,我们只需要设置num_box中第225、303、17、……个元素为非零就可以了。
那么num_box中第225个元素的下标是什么呢?
行下标 = 225 / 30(列数) = 7
列下标 = 225 % 30(列数) = 15
这样我们只需设置num_box = 1即可。
如果对本算法有疑问可以HI我。
另外那个隐藏控制台窗口的pragma依赖于具体编译器、我用VC++6.0可以达到隐藏控制台的目的, 但是那段代码在codeblocks10.05下就起不到隐藏控制台的效果了。 至于你说的错误, 我就不知道是什么原因了。
*/
#include 《stdio.h》
#include 《stdlib.h》
#include 《string.h》
#include 《time.h》
#include 《assert.h》
#define NUMS 20 /* 二维数组中非零元素个数1~400均可 */
#define LINES 20
#define COLS 20
void create_rand_index(int index, int num)
{
int index_box;
int index_nums = LINES * COLS;
int randindex;
int i, t;
assert(num 《= RAND_MAX);
assert(num 《= index_nums);
for (i = 0; i 《 index_nums; i++) {
index_box = i;
}
for (i = 0; i 《 num; i++) {
randindex = rand() % index_nums;
t = index_box;
index_box;
index_box = t;
}
memcpy(index, index_box, num * sizeof(int));
}
int main(void)
{
int num_box = {0};
int non_zero_index;
int line, col;
int i, j;
srand((unsigned int)time(NULL));
create_rand_index(non_zero_index, NUMS);
for (i = 0; i 《 NUMS; i++) {
line = non_zero_index / COLS;
col = non_zero_index % COLS;
num_box = 1;
}
for (i = 0; i 《 LINES; i++) {
for (j = 0; j 《 COLS; j++) {
printf(num_box == 1 ? "■" : "□"); /* 为了方便查看 */
}
putchar(’\n’);
}
return 0;
}
审计技术与方法的3个题目
1. D注册会计师推断的存货总体错报=50500/50000*300000
2. (1)随机数表适用数字为:93 093,72 905,14 342,25 595,22 527,05 463,63 661,53 342,02 011,85 313
对应的发票号:3093,2905,4342,5595,2527,5463,3661,3342,2011,5313
(2)样本平均错报=(1000300-1000000)/10=30
推断的总体错报=样本平均错报*总体数量=30*4000
3.(1)随机间隔=72/6=12,第二笔为6+12,第三笔为6+12+12,以此类推
(2)Y公司2004年12月31日应付票据的总体实际价值=1680000/1400000*15000000
这道题怎么做
解:(1)将每个人编号,由0001至1003.
(2)利用随机数表法找到3个号,将这3个人排除.
(3)重新编号0001至1000.
(4)按编号顺序将号码等分为10段,每段100个,0001至0100为第1段.
(5)在第1段中用简单随机抽样法抽得一个号码l.
(6)按编号,将l,100+l,200+l,…,900+l共10个号选出.
这10个号对应的10个人就组成了一个样本.
打字不易,请采纳

更多文章:
数据库管理系统和数据库系统分别侧重(数据库,数据库管理系统,数据库系统,这三个分别是什么意思并举个实例)
2026年9月7日 17:00
springmvc的依赖(springMVC的注入方式有哪几种,这与springMVC依赖)
2026年9月7日 14:00
display flex 自动换行(overflow-y:hidden;overflow-x:auto;无效解决方法)
2026年9月7日 11:00
timestamp without time zone(Postgresql中to_date()函数使用问题)
2026年9月7日 09:40






