三维随机数组的应用

本文介绍了如何使用C++生成三维随机数组,并探讨其在三维空间模拟和数据分析中的应用。通过实例代码展示了具体实现过程。
需求:
在三维空间中,随机生成POINTNUM/2组空间点,每组有2个点,各组之间完全独立,
每组两点间距为LEN,要求各个点在长度为MAXN的正方体中。


抽象模型:
每个点用一维数组储存,数组元素类型是有三个变量的结构体,
通过随机生成三个变量,模拟随机生成空间点,
对于点a(x1,y1,z1)和点b(x2,y2,z2),
要求满足(x1-x2)²+(y1-y2)²+(z1-z2)²=LEN²(1≤x1,y1,z1≤MAXN)。


通过公式可看出,任意的平方项都非负,而且都要小于LEN²,
所以每个平方项里的两个变量之差不能超过LEN½,
当今且当其中两个平方项为0时,第三个平方项才为LEN²。


具体实现:
首先随机生成POINTNUM/2个满足条件的数组codit[i](i=0,2,4,...,POINTNUM-2),
假设a,b,c,d,e为已知满足条件的变量,k值未知,
对于每一个数组codit[i],假设其值为(a,b,c),求另一个随机数组codit[i+1],
随机生成另一个数组 (d,e,k),其中0≤d<a+LEN,0≤d<b+LEN,
通过(a-d)²+(b-e)²+(c-k)²=LEN² 求出k,
从而实现随机生成两个点的效果。
所有数值保留6位小数点


C++实现:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <ctime>
#include <cmath>
#define DataType double                 //数组元素数值的类型
#define POINTNUM 200                    //点的数目,偶数
#define MAXN 1000                       //数组元素数值的最大值,正整数
#define DECIMAL 1000000                 //取随机小数时用的常量
#define LEN 100                         //两点间距

using namespace std;

struct node
{
    DataType x, y, z;                    //点坐标
}codit[POINTNUM]={0};

DataType randomFirstCodit()
{
    DataType inte = (DataType)(rand()%MAXN+1);
    DataType decil = (DataType)((rand()%DECIMAL)/(DECIMAL*0.1));
    return (DataType)(inte+decil);
}

DataType randomSecondX(DataType length)
{
    int temp = (int)sqrt(length);
    if(temp*temp == length)    temp--;
    DataType inte = (DataType)temp;
    DataType decil = (DataType)((rand()%DECIMAL)/(DECIMAL*0.1));
    return (DataType)(inte+decil);
}

DataType randomSecondY(DataType x1, DataType x2)
{
    DataType var = LEN*LEN - (x2-x1)*(x2-x1);
    return randomSecondX(var);
}

DataType caculate(DataType a,DataType b,DataType c,DataType d,DataType e)
{
    DataType sqrtNum = (DataType)sqrt(LEN*LEN - (d-a)*(d-a) - (e-b)*(e-b));
    return c-sqrtNum>0 ? c-sqrtNum : c+sqrtNum;
}
void print()
{
    for(int i = 0; i < POINTNUM-1; i+=2){
        if(i%2==0) printf("第%d组:\n",i/2+1);
        printf("(%.6lf , %.6l
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值