随机数与简单的周期运动轨迹图案

2023-11-14

背景

概率论的书上有这样一个示例:设想某人在平面上从零点出发,手持一个均匀四面体,四面分别标有1,2,3,4,每个面代表一个方向(东南西北),他随意抛出后,按照这个方向走一单位长度,若干次后观测他走过的路线的轨迹,由此你有什么联想?

联想倒是没啥,出于好奇编了个简单的程序,看看这个轨迹会是什么样的。

流程

先是用随机数取余,然后把前后位置的线连起来

direction = rand() % 4;
line(X + N * a[0], Y + N * a[1], X + N * a[2], Y + N * a[3]);

得到的图形挺有意思的(说实话我不会相信那个人如果真的丢起四面体来他的路径会长这样)
在这里插入图片描述
然后出于好玩,我加了渐变的颜色

color = getlinecolor();
RGBtoHSL(color, &H, &S, &L);
H += 0.5;
setlinecolor(HSLtoRGB(H, S, L));

在这里插入图片描述
后来又加了四个方向(左上,左下,右上,右下),经历512571步才回到原点。
在这里插入图片描述

在这里方向的设定为:

数字 0 1 2 3 4 5 6 7
方向 左上 右上 右下 左下

上面的设定很有次序,但是如果我把顺序打乱:

数字 0 1 2 5 3 4 7 6
方向 左上 右上 右下 左下

虽然还是能看到那个小点在同一个轨迹上运动,但是没有了对称性。在这里插入图片描述
于是我用了一个数组和一个函数,将方向和数字随机匹配(随机匹配过程还是用的同样的随机数生成方法rand()),得到的图像:在这里插入图片描述
与之前的相比,轨迹运动周期反而更小了,而且每个周期运动的轨迹没有重叠在一起

全部代码:

#include<stdio.h>
#include<graphics.h>
#include<conio.h>
#include<time.h>
#include<math.h>
#define X 500//坐标
#define Y 300
#define N 0.5//图案大小
void fun(int* p)//将8个数字随机排列
{
	int i, j, k;
	for (i = 0; i < 8; i++)
	{
		p[i] = 9;
	}
	for (i = 0; i < 8; i++)
	{
		while (1)
		{
			j = rand() % 8;
			if (p[j] == 9)
			{
				p[j] = i;
				break;
			}
		}
	}
}
void main()
{
	initgraph(1000, 600, SHOWCONSOLE);
	setbkcolor(WHITE);
	cleardevice();
	srand(time(NULL));
	int  direction;
	int a[4] = { 0 };
	int b[8] = { 0,1,2,34567 };//按顺序来形成的图片才对称
	double n = 0;
	float H = 0, S = 0.8, L = 0.8;
	int color;
	setwritemode(R2_COPYPEN);
	setlinestyle(PS_SOLID, 1);
	setlinecolor(RED);

	while (1)
	{
		n = 0;
		H = 0, S = 0.5, L = 0.5;
		/*while (1)
		{
			a[2] = a[0];
			a[3] = a[1];
			setlinecolor(BLACK);
			direction = rand() % 4;
			if (direction == 0)//左
			{
				a[0]--;
			}
			else if (direction == 1)//上
			{
				a[1]--;
			}
			else if (direction == 2)//右
			{
				a[0]++;
			}
			else if (direction == 3)//下
			{
				a[1]++;
			}
			line(X + N * a[0], Y + N * a[1], X + N * a[2], Y + N * a[3]);
		}*/
		while (1)
		{
			a[2] = a[0];
			a[3] = a[1];
			n++;
			color = getlinecolor();
			RGBtoHSL(color, &H, &S, &L);
			H += 0.5;
			setlinecolor(HSLtoRGB(H, S, L));
			direction = rand() % 8;

			//fun(b);

			if (direction == b[0])//左
			{
				a[0]--;
			}
			else if (direction == b[1])//左上
			{
				a[0]--;
				a[1]--;
			}
			else if (direction == b[2])//上
			{
				a[1]--;
			}
			else if (direction == b[3])//右上
			{
				a[0]++;
				a[1]--;
			}
			else if (direction == b[4])//右
			{
				a[0]++;
			}
			else if (direction == b[5])//右下
			{
				a[0]++;
				a[1]++;
			}
			else if (direction == b[6])//下
			{
				a[1]++;
			}
			else if (direction == b[7])//左下
			{
				a[0]--;
				a[1]++;
			}

			line(X + N * a[0], Y + N * a[1], X + N * a[2], Y + N * a[3]);
			printf("%d,%d,%.lf\n", a[0], a[1], n);
			if (a[0] == 0 && a[1] == 0)
			{
				printf("^_^\t%.lf", n);
				break;
			}
		}
		//_getch();
	}

}

看到这样的图形我总是想到分形并努力想找到自相似的特征。但是后来想形成图案的根本原因还是在随机数的生成机制。而且这些图应该也能反映这种伪随机数的一些特征。

由于是上网课的时候突然想到这个问题,考虑到第一次概率论,讲的应该还是高中的衔接部分,就没认真听讲。。。结果后来突然发现讲到了上极限下极限。。。听不懂了
在这里插入图片描述

给人的感觉就是
在这里插入图片描述
哈哈

希望懂得随机数生成原理的大佬能给我解释下这些魔性的图案背后的原理

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

随机数与简单的周期运动轨迹图案 的相关文章

随机推荐

  • QTcpSocket 发送数据的几种方法

    1 QTcpSocket 继承于QAbstractSocket继承于QIODevice 2 QTcpSocket 提供的几种接收和发送数据方法 write const char qint64 qint64 write const char
  • 一百、Kettle(9.3.0)连接ClickHouse

    注意 低版本的kettle即使装ClickHouse驱动包后也不一定支持ClickHouse数据库连接 具体kettle从什么版本开始支持ClickHouse没测试过 只有高版本的kettle在安装ClickHouse驱动包后才支持Clic
  • 关于Winsows安装baselines的问题

    关于Winsows安装baselines的问题 windows是否可以使用baselines 根据GitHub上关于baselines的介绍 只有Linux和MAC OS给了配置说明 用pip在windows上安装的baselines只有最
  • HTML获取当前选中的li标签

    获取该class下的li标签 layui tab title li click function li标签下标默认为0 var liindex this index
  • foreach跳出本次/当前循环与终止循环方法及switch跳出方法

    目录 1 普通for循环 2 java中的foreach循环 3 js中的foreach循环 4 switch 1 普通for循环 continue 当满足某个条件时 想要跳出本次循环继续执行下次循环 break 满足某个条件的时候 终止f
  • 遗传算法优化BP神经网络的原理是什么

    遗传算法优化BP神经网络的原理是通过进行大量重复的试验 使用遗传算法来改进和优化神经网络的参数 以使神经网络能够更好地完成特定任务 遗传算法通过进化算法对神经网络中的参数进行重新调整 从而获得更好的性能
  • SQL中的CASE WHEN使用 .

    Case具有两种格式 简单Case函数和Case搜索函数 简单Case函数 CASE sex WHEN 1 THEN 男 WHEN 2 THEN 女 ELSE 其他 END Case搜索函数 CASE WHEN sex 1 THEN 男 W
  • 萤石摄像头RTSP流获取(黑屏解决)

    前言 在获取萤石摄像头RTSP视频流时 视频流获取不成功 黑屏并且一直显示缓冲中 下面对获取过程中查阅的资料和解决方案做一下汇总 打开RTSP 在萤石云视频APP中打开RTSP 我的 工具 局域网设备预览 开始扫描 选择摄像头 设置 更多设
  • 本地代码上传github

    怎么将新创建的本地代码上传到github上 这里简单的记录一下 我喜欢使用命令行 这里全用命令行来实现 不了解git命令的可以去了解下 1 先在github中创建仓库 2 回到你本地项目路径下右击打开git 没有的自行安装即可 3 初始化
  • ios.js?v=7c33aa19:1183 Uncaught (in promise) AxiosError {message: ‘Request failed with status code 4

    ios js v 7c33aa19 1183 Uncaught in promise AxiosError message Request failed with status code 404 name AxiosError code E
  • mysql中 or的使用方法,mysql条件查询中与or同时使用时的注意事项!!

    我们在日常的crud开发中 经常会遇到查询数据不是预期效果的问题 但是有感觉自己的查询语句没什么问题呀 怎么会出错呢 今天我也中招了 就很烦 sql如下 在查询语句中我们有一个条件是year 2021 但是查询结果还包含了2020的数据 这
  • Windows WSL配置ubuntu环境并登录

    一 什么是WSL wsl即适用于Windows的Linux子系统 Windows subsystem for Linux 二 Windows WSL配置ubuntu环境 1 管理员运行cmd 执行以下命令启用 适用于 Linux 的 Win
  • Codeforces Round 739 (Div. 3)

    A Dislike of Threes AC代码 include
  • Git的版本和分支管理

    1 http blog csdn net xiahouzuoxin article details 9393119 2 http blog csdn net xiahouzuoxin article details 9398629 3 ht
  • Qt在linux系统中执行shell命令

    在linux系统下 Qt执行shell命令的方式有3种 1 QProcess execute ls 2 system ls 3 QProcess process new QProcess process gt start ls 注1 以上3
  • 解决ubuntu20搜狗输入法输入不了中文问题

    解决在ubuntu上安装好搜狗输入法后无法输入中文 首先按照官网的安装步骤安装 Ubuntu搜狗输入法安装指南 注意不要忘记安装依赖 输以下命令进行安装 sudo apt install libqt5qml5 libqt5quick5 li
  • 接口测试的测试用例该怎么写呢?

    作者 字节开发测试 链接 https www zhihu com question 305629217 answer 2530044958 来源 知乎 著作权归作者所有 商业转载请联系作者获得授权 非商业转载请注明出处 一 什么是接口 接口
  • Python的exec

    目录 exec 简单使用 动态执行简单的字符串代码 动态执行较复杂的代码 执行文件中的Python代码 在exec中传参 使用中遇到的问题 参考 exec 简单使用 个人比较喜欢用Python里面的exec 可以用来动态执行字符串代码 在f
  • bootstrap方法_自助法(bootstrap)在统计检验中的应用及R语言实现过程

    Bootstrap 自助法 自举法 是非参数统计中一种重要的估计统计量方差 进而进行区间估计的统计方法 Bootstrap通过对给定数据集进行有放回的重抽样以创建多个模拟数据集 生成一系列待检验统计量的经验分布 可以计算标准误差 构建置信区
  • 随机数与简单的周期运动轨迹图案

    背景 概率论的书上有这样一个示例 设想某人在平面上从零点出发 手持一个均匀四面体 四面分别标有1 2 3 4 每个面代表一个方向 东南西北 他随意抛出后 按照这个方向走一单位长度 若干次后观测他走过的路线的轨迹 由此你有什么联想 联想倒是没