重塑我们对随机性在计算中的作用的理解

2023年图灵奖,最近刚刚颁给普林斯顿数学教授 Avi Wigderson!作为理论计算机科学领域的领军人物,他对于理解计算中的随机性和伪随机性的作用,作出了开创性贡献。

Avi Wigderson 的履历

自 1999 年以来,Wigderson 一直担任普林斯顿高等研究院数学学院赫伯特-H-马斯教授。此前,他曾担任耶路撒冷希伯来大学教授,并在普林斯顿大学、加州大学伯克利分校、IBM 等机构担任客座教授。

Wigderson 毕业于以色列理工学院,并获得普林斯顿大学计算机科学硕士、MSE 和博士学位。

他获得的荣誉包括阿贝尔奖、IMU 算盘奖、唐纳德-E-克努特奖、Edsger W. Dijkstra 分布式计算奖和哥德尔奖。他是 ACM Fellow、美国国家科学院和美国艺术与科学院院士。

Avi Wigderson教授在计算复杂性理论的贡献

提示:Avi Wigderson教授在计算复杂性理论方面的工作是其获得图灵奖的主要贡献之一。他的研究不仅推动了理论计算机科学的发展,还对现代计算产生了深远的影响。

从根本上说,计算机是确定性系统;应用于任何给定输入的算法指令集唯一地决定了其计算,尤其是其输出。换句话说,确定性算法遵循的是一种可预测的模式。相比之下,随机性则缺乏明确的模式,或者说事件或结果缺乏可预测性。

由于我们生活的世界中充满了天气系统、生物和量子现象等随机事件,计算机科学家丰富了算法,允许它们在计算过程中做出随机选择,借此提高算法的效率。

事实上,许多没有已知高效确定性算法的问题,已经通过概率算法得到了高效解决,尽管存在一些小概率错误(可以有效减少)。

理解计算中随机性和伪随机性,加深对计算中随机性动态的理解,可以帮助我们开发出更好的算法,并加深我们对计算本身性质的理解。

从计算机科学诞生之初,研究人员就认识到,随机性是为各种应用设计更快算法的一种方法。为更好地理解随机性所做的努力将继续为我们的领域带来重要益处。

随机数,也即“随机选择的数”,是在一个有限数集上的一个一致分布的随机序列。随机数在许多方面有应用,如仿真、抽样、数值分析、计算机程序、娱乐等方面都有所应用。计算机用确定算法计算出来的随机数系列是伪随机数,并不是真正的随机数,但是其具有随机数的统计特征,如均匀性、独立性等。


在上世纪初,冯诺伊曼建议用平方,然后取结果中间的数据作为随机数(平方取中法)。结果看起来修似乎是随机的,但是很多人对此质疑。实际上这并不是好的随机方法,尤其是针对一些短循环序列。

计算机科学家发现了随机性与计算难度之间的显著联系(即确定没有高效算法的自然问题)。

在标准的、被广泛相信的计算假设下,每一种概率多项式时间算法都可以有效地去随机化(即完全确定)。

换句话说,随机性并不是高效计算的必要条件。这一系列著作彻底改变了我们对随机性在计算中的作用的理解,也改变了我们对随机性的思考方式。

这些影响深远的论文包括以下三篇:

1)“Hardness vs. Randomness”(与 Noam Nisan 合著)。 除其他发现外,这篇论文还介绍了一种新型伪随机发生器,并证明了在比以前已知的假设更弱的条件下,随机算法的高效确定性模拟是可能的。

论文链接:https://www.math.ias.edu/~avi/PUBLICATIONS/MYPAPERS/NOAM/HARDNESS/final.pdf

2)“BPP Has Subexponential Time Simulations Unless EXPTIME has Publishable Proofs”(与 László Babai、Lance Fortnow 和 Noam Nisan 合著) 这篇论文利用“hardness amplification”证明,在较弱的假设条件下,有界错误概率多项式时间(BPP)可以在亚指数时间内模拟无限多的输入长度。

论文链接:https://www.math.ias.edu/~avi/PUBLICATIONS/MYPAPERS/NOAM/HARDNESS/final.pdf

3)“P = BPP if E Requires Exponential Circuits: Derandomizing the XOR Lemma”(与 Russell Impagliazzo 合著) 这篇论文介绍了一种更强的伪随机发生器,它在硬度与随机性之间实现了基本最优的权衡。

论文链接:https://dl.acm.org/doi/pdf/10.1145/258533.258590

重要的是,这三篇论文的影响远远超出了随机性和反随机化领域。这些论文中的观点后来被应用于理论计算机科学的许多领域,并推动了该领域多位领军人物发表具有影响力的论文。 后来,Wigderson 与 Omer Reingold、Salil Vadhan 和 Michael Capalbo 合作,仍然在计算随机性的广泛领域开展工作,在另一篇论文中首次提出了扩展图的高效组合构造,扩展图是一种稀疏图,具有很强的连通性。它们在数学和理论计算机科学领域都有许多重要应用。

论文链接:https://www.math.ias.edu/~avi/PUBLICATIONS/MYPAPERS/CRVW01/crvw01.pdf

除了在随机性方面的研究之外,Wigderson 还是多验证器交互式证明、密码学和电路复杂性等理论计算机科学内多几个领域的领袖。

“伪”随机数生成器(PRNG)

具有任何编程经验的人都知道计算机是确定性机器。如果你提供相同的输入,则将始终获得相同的输出。这就是为什么让计算机偶然生成随机数比看起来复杂的多。

随机数应用在密码学到博彩,视频游戏等很多行业。但是,计算机天生就不能随机。相反,程序员依靠伪随机数生成器(PRNG),从称为种子/seed的给定起始值以编程方式生成新的随机数。

这些算法有其自身的局限性。由于随机数是通过程序生成的,因此,如果有人能够识别出使用的种子值和PRNG算法,他们将能够预测序列中的下一个随机数。这将使攻击者可以解密,预测序列中的下一张纸牌,在视频游戏中作弊等。

但是PRNG在涉及建模和仿真的情况下仍然非常有用,因为它允许通过使用相同的种子初始化随机数生成器来“重播”一系列随机事件。

“真”随机数生成器(TRNG)

在随机性第一的场景下,我们使用“真”随机数生成器(TRNG)。与具有任意种子值的PRNG不同,TRNG从其环境/外部数据中选择一个种子值。

以下是一些潜在的选择:

  • 鼠标动作
  • 风扇噪音
  • 气压
  • 自上一整秒以来的微秒数

只需要选择攻击者无法预测的种子即可。然后,该种子值将被传递到类似于PRNG的算法中,该算法将生成一个随机数。

两种方法之间的实际差异

PRNG比TRNG更快,PRNG的确定性在你要重播一系列“随机”事件的情况下非常有用。

此外,某些PRNG算出的随机数,本质上是周期性的,有一定的确定概率,但是使用好的初始化参数的现代PRNG,这个周期可以足够长。

相反,TRNG比PRNG慢,没有确定性,并且不是周期性的。

线性同余生成器

实现一个简单的PRNG。一个称为线性同余生成器(LCG)算法的变体。LCG以前是最常用和研究最多的PRNG之一。

这是LCG(linear congruential generator)的迭代算法:

由以下参数组成:

参数macX
性质模数乘数加数随机数
作用取模移位偏移作为结果

记录了一些常用的模数m,乘数a和增量值c。关于最佳值的建议尚无统一看法,因此各个实现之间存在不同的值。

LCG算法是如下的一个递推公式,每下一个随机数是当前随机数向左移动 log2 a 位,加上一个 c,最后对 m 取余,使随机数限制在 0 ~ m-1 内。

我们必须注意这些参数的取值。

  • X是随机数序列
  • m,0<m,模
  • a,0<a<m,乘子
  • c,0≤c<m,增量,也叫做偏移量
  • X0 , 0≤X0<m,开始值,通常叫做“种子”seed

选择错误的值可能会导致创建一个过短的周期,从而使我们的随机数生成器无用。

当c=0时候,LCG就变换成了乘法同余发生器,multiplicative congruential generator (MCG), c≠0时叫做混合同余发生器,mixed congruential generator,MCG。

从该式可以看出,该算法由于构成简单,具有以下优点:

  • 计算速度快
  • 易于实现
  • 易于写入硬件

上面的线性同余方程,选定a、X、c和m四个魔数,可以生成线性同余序列,线性同余序列在一个周期内存是随机的,独立的,一个周期完成之后,循环进行。
当m=9,a=2,c=0,seed=1时,得:
X 0 = s e e d = 1

X 2 = ( a ∗ X 1 + c ) m o d      m = ( 2 × 1 + 0 ) % 9 = 2

X 3 = ( a ∗ X 2 + c ) m o d      m = ( 2 × 2 + 0 ) % 9 = 4

X 4 = ( a ∗ X 3 + c ) m o d      m = ( 2 × 4 + 0 ) % 9 = 8

X 5 = ( a ∗ X 4 + c ) m o d      m = ( 2 × 8 + 0 ) % 9 = 7

X 6 = ( a ∗ X 5 + c ) m o d      m = ( 2 × 7 + 0 ) % 9 = 5

X 7 = ( a ∗ X 6 + c ) m o d      m = ( 2 × 5 + 0 ) % 9 = 1 
在下图中,可以看到对参数的微小更改会极大地影响周期长度,m、a、c取值不同,其循环的周期长度是不同的,并且随机的效果也是不同的。

可以看出,针对不同的参数,lcg产生的效果差别很大。

m、a、c取值不同,其循环的周期长度是不同的。为了使得线性同余序列的周期长度达到最大m,需要满足以下3个条件:

m and c are relatively prime(互为质数,即两个数没有除1之外的公约数)
a-1 is divisible by all prime factors of m(m的质因数(可以整除m的所有质数),都能整除a-1,也即a-1是m的所有质因数的倍数)
a-1 is divisible by 4 if m is divisible by 4 (如果m被4整除,a-1也被4整除,即m是4的倍数,a-1也要是4的倍数)。

以下是针对不同环境下的参数选择:

//是质数
bool prime(int N)
{
	if (N < 2)
		return false;
	if (N == 2)
		return true;

	for (int i = 2; i < std::sqrt(N*1.0); i++)
	{
		if (N%i == 0) //i能被j整除,N不是质数
		{
			return false;
		}
	}

	return true;
}
//互质
bool isrp(int a, int b)
{
	if(a <=0 || b<=0 || a==b)
	{ // 互质整数不能小于或等于0
		return false;
	}
	else if(a==1 || b==1)
	{ // 两个正整数中,只有其中一个数值为1,两个正整数为互质数
		return true;
	}
	else
	{
		// 求出两个正整数的最大公约数
		while(1)
		{
			int t = a%b;
			if(t == 0)
			{
				break;
			}
			else
			{
				a = b;
				b = t;
			}
		}
		if( b > 1){ // 如果最大公约数大于1,表示两个正整数不互质
			return false;
		}else{ // 如果最大公约数等于1,表示两个正整数互质
			return true;
		}
	}
}
// 所有质因数
class QualityFactor
{
public:
	vector<int> m_vInt;
public:
	void QFContract(long a) //用短除法对合数进行分解
	{
		while(a>1)
		{
			for(int i=2;i<=a;i++)
			{
				if(a%i==0) //短除法
				{
					a = a/i;
					if (std::find(m_vInt.begin(), m_vInt.end(), i) == m_vInt.end())
						m_vInt.push_back(i);
					break;
				}
			}
		}
	}
}
// 所有质因数整除
int MaxCommondMultiple(const vector<int>& _vInt, BOOL _bFour, int _nSrc)
{
	int nCommonMultiple = 1;
	while (nCommonMultiple < _nSrc)
	{
		for (auto it = _vInt.begin(); it != _vInt.end(); ++it)
		{
			nCommonMultiple*= *it;

			if (_bFour && (nCommonMultiple%4 != 0))
			{
				continue;
			}

			BOOL bFind = TRUE;
			for (auto it = _vInt.begin(); it != _vInt.end(); ++it)
			{
				if (nCommonMultiple % *it != 0)
				{
					bFind = FALSE;
					break;
				}
			}

			if (bFind)
			{
				return nCommonMultiple;
			}
		}
	}

	return 0;
}
// 随机数函数
static int seed = 0;
int random(int a, int b, int m)
{
	seed = (seed * a + b) % m;
	return seed;
}

//输入最大周期长度m,即可以根据上述函数生成相应的a和c。

代码实现

使用早期C语言标准(C90 / C99 / ANSI C和C11)中记录的值去实现。

随机数在概率算法设计中是必须的。在计算机上无法产生真正的随机数,一般使用伪随机数发生器产生的伪随机数。
伪随机数发生器是一个算法,产生的数列元素之间近似相互独立,多数力图产生的样本同分布。
常用的伪随机数发生器:线性同余发生器、滞后Fibonacci发生器、线性反馈移位发生器、广义反馈移位发生器等。

macX是一级相关数,选定m之后,同样会有很多组对应的acX。不同的数据,对应的随机数分布是不一样的。随机效果也是大大不同。理论上m选择的范围越方,其效果越好。而VS实现的std::rand()即是采用线性同余方程实现的。其周期较小,所以随机效果不是特别好。另外其中的几个常数,是经常大量实验选择的,是随机效果相对较好的一组数。
线性同余发生器:线性同余法产生的随机序列 a1,a2,……,an,满足
1、a0=d; 其中d称为种子。
2、an=(b*a(n-1)+c) mod m,n=1,2,……,b ≥ \geq≥ 0, c ≥ \geq≥ 0, d ≥ \geq≥ m 。

用此方程生成的一组序列,随机效果不错。线性同余方程生成的序列,被称为线性同余序列。线性同余序列在一个周期内重复出现。并且方程中有四个魔数(常数),但是这四个魔数,对随机的效果影响巨大。线性同余发生器(Linear congruential generator,LCG)用于生成随机序列。
线性同余发生器一直是随机数生成的主要方式,但是其随机效果不是特别好。C++11引入了梅森旋转演算法的随机数引擎,是目前效果最好的随机算法。std::default_random_engine默认即使用梅森旋转演算法。也可以直接使用梅森旋转演算法引擎std::mt19937。

a = 1103515245

m = 2³¹

c = 12345

无论选择哪种PRNG算法,都应导致随机数的均匀分布和足够长的时间。

#include <stdio.h>
#include <time.h>
#include <stdlib.h>

const unsigned long maxshort = 65536L;
const unsigned long multiplier = 1194211693L;
const unsigned long adder = 12345L;

class RandomNumber
{
private:
    unsigned long randSeed;

public:
    RandomNumber(unsigned long s = 0);             //构造函数
    unsigned short randomInteger(unsigned long n); //产生0--n-1之间的随机整数
    double randomFloat(void);                      //产生[0,1)之间的随机实数
};

RandomNumber::RandomNumber(unsigned long s)
{
    if (s == 0)
    {                            //用系统时间产生种子
        time_t tm = time(NULL);  //获取系统时间
        srand((unsigned int)tm); //用来设置rand()产生随机数时的随机种子
        randSeed = rand();       //产生一个随机数值
    }
    else
    { //由用户定义随机数值
        randSeed = s;
    }
}
/*
    产生0--n-1之间的随机整数,用线性同余计算的新种子高16位随机性好,将其右移16位
*/
unsigned short RandomNumber::randomInteger(unsigned long n)
{
    randSeed = multiplier * randSeed + adder;
    return (unsigned short)((randSeed >> 16) % n);
}
/*
    产生[0,1)之间的随机实数
*/
double RandomNumber::randomFloat(void)
{
    return randomInteger(maxshort) / double(maxshort);
}

int main()
{
    printf("请输入一个种子:");
    unsigned long rs;
    scanf("%ld", &rs);
    RandomNumber rn(rs);

    printf("\n请输入一个整数(确定随机数的范围):");
    int n;
    scanf("%d", &n);

    printf("\n产生0--%d之间的随机整数:%u \n", n - 1, rn.randomInteger(n));
    printf("\n产生[0,1)之间的随机实数为:%lf\n\n\n\n", rn.randomFloat());

    return 0;
}

模拟扔骰子

如果你掷两个骰子,重复结果的可能性是16.67%。如果您正在滚动三个骰子,重复结果的可能性为44.44%。 随着我们掷出越来越多的骰子,观察到的频率与通过概率预测的频率越来越接近。这个原则适用于所有的概率实验,被称为 大数定律 。

类似地,当我们增加一次掷出的骰子数量时,你还可以看到概率从一条直线(一个骰子)变为一个三角形(两个骰子),最后变为一条 "钟形"曲线,这就是所谓的 中心极限定理,钟形曲线被称为 正态分布 。

参见:

Avi Wigderson Receives 2023 ACM A.M. Turing Award - Press Release | Institute for Advanced Study

Randomness Conductors and Constant-Degree Expansion Beyond the Degree / 2 Barrier

2023 Turing Award

随机数研究新突破:中国科大在国际上首次实现器件无关的量子随机数

中国科大提出并实现新型量子随机数发生器

掷骰子 – 概率 – Mathigon

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/559330.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python五子棋VS人机对战

上一次编写了一个python五子棋游戏,但是属于玩家之间的对战。今天介绍五子棋和人机对战。本博文目的是教学和一些毕业设计。 目前电脑下棋逻辑算法还是比较简单的,不能和市面上五子棋相提并论,请大家理想对待! 代码: import pygame import sys import tkinter as tk fro…

再拓信创版图-Smartbi Insight V11与东方国信CirroData数据库完成兼容适配认证

近日&#xff0c;思迈特商业智能与数据分析软件 [简称&#xff1a;Smartbi Insight] V11与北京东方国信科技股份有限公司 &#xff08;以下简称东方国信&#xff09;CirroData-OLAP分布式数据库V2.14.1完成兼容性测试。经双方严格测试&#xff0c;两款产品能够达到通用兼容性要…

python语言零基础入门——注释、print()函数、input()函数

目录 一、注释 1.块注释 2.行内注释 3.多行注释 二、打印变量 1.print()函数&#xff1a;输出/打印指定内容 2.input()函数&#xff1a;输入指定内容 三、编程题&#xff1a;个人名片 一、注释 1.块注释 以#开始&#xff0c;直到本行结束都是注释为了保证代码的可读性…

初步学习node.js文件模块

环境已安装好&#xff1b; 写一个read1.js如下&#xff1b; var fs require("fs"); var data ;// 创建一个流 var stream1 fs.createReadStream(test1.jsp); stream1.setEncoding(UTF8);// 绑定data事件 stream1.on(data, function(mydata) {data mydata; });/…

Unity ECS

一&#xff1a;前言 ECS与OOP不同&#xff0c;ECS是组合编程&#xff0c;而OOP的理念是继承 E表示Entity&#xff0c;每个Entity都是一个有唯一id的实体。C表示Component&#xff0c;内部只有属性&#xff0c;例如位置、速度、生命值等。S表示System&#xff0c;驱动实体的行为…

Leetcode. 12 整数转罗马数字

罗马数字包含以下七种字符&#xff1a; I&#xff0c; V&#xff0c; X&#xff0c; L&#xff0c;C&#xff0c;D 和 M。 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例…

原来我一直被骗了!Burp suite诱导劫持攻击【附工具】

一、点击劫持 点击劫持是一种基于界面的攻击&#xff0c;用户通过点击诱饵网站中的一些其他内容被诱骗点击隐藏网站上的可操作内容。举例来说&#xff0c;一个网络用户可能会访问一个诱饵网站&#xff08;可能是通过电子邮件提供的链接&#xff09;&#xff0c;并点击一个按钮以…

C语言---贪吃蛇(二)---逻辑和代码的实现

文章目录 前言1.准备工作2.蛇的相关属性3.游戏流程设计3.1.游戏开始(GameStart)3.1.1.设置光标位置3.1.2.隐藏光标3.1.3.打印欢迎界面3.1.4.创建地图3.1.5.初始化蛇身3.1.6.创建食物 3.2.游戏运行(GameRun)3.2.1.打印信息栏3.2.2.蛇身的移动3.2.2.1.判断下一个结点是否为食物3.…

【Linux】iptables的应用

iptables 防火墙 防火墙是一种网络安全系统&#xff0c;它位于内部网络与外部网络&#xff08;如互联网&#xff09;之间&#xff0c;通过实施预定义的安全策略来控制网络间的通信。防火墙的主要目标是保护内部网络资源免受未经授权的访问、攻击或潜在威胁&#xff0c;同时允…

FFmpeg源码编译

msys2 依赖环境安装 依赖环境安装编译X264编译 fdk-aac文件处理编译x265编译FFmpeg 依赖环境安装 编译X264 用于h264 AVC视频格式编码 CCcl ./configure --enable-shared #指定使用cl,编译成动态链接库 make -j32 #使用32线程进行编码 make install命令一 关于第一条命令执…

VUE的import store from ‘./vuex/store改为‘ import store from ‘./vuex/store.js‘

ERROR Failed to compile with 1 error 下午5:25:40 error in (webpack)-dev-server/client?http://10.18.173.180:8081/sockjs-node Syntax Error: no such file or directory, open D:\4myroom\H…

2024年,新手做抖店千万犯这几点错误,轻则保证金,重则封店!

哈喽~我是电商月月 很多做抖音小店的新手朋友都忽略了违规操作这一部分&#xff0c;交完保证金以为后续不开了保证金还能退回&#xff1f;别天真了&#xff01; 不了解抖音小店的行为规则&#xff0c;违规了不仅保证金没了&#xff0c;严重的话&#xff0c;店铺都开不下去&am…

【精简改造版】大型多人在线游戏BrowserQuest服务器Golang框架解析(2)——服务端架构

1.架构选型 B/S架构&#xff1a;支持PC、平板、手机等多个平台 2.技术选型 &#xff08;1&#xff09;客户端web技术&#xff1a; HTML5 Canvas&#xff1a;支持基于2D平铺的图形引擎 Web workers&#xff1a;允许在不减慢主页UI的情况下初始化大型世界地图。 localStorag…

谷雨,春天的最后一次回眸

人生并不像火车要通过每个站似的经过每一个生活阶段。 今日谷雨&#xff0c;这不是技术文&#xff0c;是码哥的碎碎念 谷雨猕漫着芭蕉的味道动了心成了情白素贞的姻以伞结缘可天若无雨地上无伞断桥未断过客&#xff0c;能留下一段传奇吗&#xff1f;或许难难 倘若在江城边不是西…

盲人购物指南:智能化辅助引领超市购物新体验

作为一名资深记者&#xff0c;我有幸见证了一位盲人朋友借助一款名为蝙蝠避障的高科技辅助应用&#xff0c;独立完成超市购物之旅&#xff0c;这一过程充分展示了盲人购物指南新时代的到来。 在前往超市的路上&#xff0c;这款应用犹如一位贴心的“电子向导”&#xff0c;实时为…

编程范式之函数编程

文章目录 **核心概念****特征****优点****示例语言**案例 函数编程&#xff08;Functional Programming, FP&#xff09;是一种编程范式&#xff0c;它强调程序由一系列不可变的值和纯函数&#xff08;Pure Function&#xff09;组成&#xff0c;尽量避免副作用&#xff08;Sid…

Zynq7000系列中PL时钟使用

可编程逻辑&#xff08;PL&#xff09;具有自己的时钟管理生成和分配功能&#xff0c;并从处理器系统&#xff08;PS&#xff09;中的时钟发生器接收四个时钟信号&#xff08;如图25-10所示&#xff09;。 在嵌入式系统中&#xff0c;PL时钟的管理和分配对于确保逻辑电路的正确…

微波炉定时器开关

微波炉火力调节开关及定时器开关内部结构 参考链接&#xff1a; 微波炉火力调节开关及定时器开关判断好坏小经验-百度经验 (baidu.com)https://jingyan.baidu.com/article/5d6edee2d175c399eadeecfd.html微波炉拆解图示&#xff0c;微波炉结构原理&#xff0c;轻松玩转微波炉维…

使用eNSP配置OSPF多区域实验

一、实验拓扑 二、实验要求 1、R4为ISP&#xff0c;其上只配置IP地址&#xff1b;R4与其他所直连设备间均使用公有IP&#xff1b; 2、R3-R5、R6、R7为MGRE环境&#xff0c;R3为中心站点&#xff1b; 3、整个OSPF环境IP基于172.16.0.0/16划分&#xff1b;除了R12有两个环回&…

HWOD:字符串字符匹配

一、知识点 c语言中&#xff0c;判断一个字符串中是否含有某字符是很容易的&#xff0c;不需要知道字符串的长度 i0; while(c ! str[i] && str[i] ! \0){ i; } if(str[i] \0){ return false; } return true; 二、题目 1、描述 判断短字符串S中的所有字符…