C# Random 随机数 全面解析

总目录


前言


一、Random 是什么?

1. 简介

表示伪随机数生成器,这是一种能够产生满足某些随机性统计要求的数字序列的算法。

public class Random

继承:Object → Random

2. 构造函数

在这里插入图片描述

3. 属性

在这里插入图片描述

4. 方法

在这里插入图片描述

二、Random 的使用

1. Next() 或 NextInt64()

Next 返回一个非负随机整数。
在这里插入图片描述

        static void Main(string[] args)
        {
            var random=new Random();
            for (int i = 0; i < 5; i++) 
            {
                var num = random.Next();
                Console.WriteLine($"{num}");
            }
            Console.ReadKey();
        }

输出结果:

76862089
1371118149
1965820566
1160787942
1644846096

2. Next(Int32) 或 NextInt64(Int64)

  • 返回一个小于所指定最大值的非负随机整数。
        static void Main(string[] args)
        {
            var random=new Random();
            for (int i = 0; i < 5; i++) 
            {
                var num = random.Next(15);
                Console.WriteLine($"{num}");
            }
            Console.ReadKey();
        }

运行结果:

2
9
2
13
11

3. Next(Int32, Int32) 或 NextInt64(Int64, Int64)

  • 返回在指定范围内的任意整数。
  • 注意:生成的随机数 包括minValue ,但是不包括maxValue
    在这里插入图片描述
        static void Main(string[] args)
        {
            var random=new Random();
            for (int i = 0; i < 5; i++) 
            {
                var num = random.Next(15,200);
                Console.WriteLine($"{num}");
            }
            Console.ReadKey();
        }

运行结果:

46
78
170
83
58

4. NextSingle() 和 NextDouble() 、Sample()

  • 返回一个大于或等于 0.0 且小于 1.0 的随机浮点数。
  • NextSingle() 支持 .NET 6/7/8/9
        static void Main(string[] args)
        {
            var random=new Random();
            for (int i = 0; i < 5; i++) 
            {
                var num = random.NextDouble();
                Console.WriteLine($"{num}");
            }
            Console.ReadKey();
        }

运行结果:

0.241523597036267
0.0462926887191332
0.585451771312138
0.628924066493718
0.972035988686623

5. NextBytes(Byte[])

  • 用随机数填充指定字节数组的元素。
        static void Main(string[] args)
        {
            var random=new Random();
            byte[] bytes = new byte[10];
            random.NextBytes(bytes);

            foreach (var item in bytes)
            {
                Console.WriteLine(item);
            }
            Console.ReadKey();
        }

运行结果:

82
94
151
251
134
195
217
150
157
129

6. Shuffle<T>(Span<T>)

  • 执行跨度的就地洗牌。

7. Shuffle<T>(T[])

  • 执行数组的就地洗牌。。

三、Random为啥是伪随机数

1. 伪随机数的原因

random是伪随机,同一秒创建的随机对象,所生成的随机队列是一样的,除非不是同一时间产生

        static void Main(string[] args)
        {
            Random random = new Random();
            Random random2 = new Random();
        Place:
            int num = random.Next(0, 11);
            int num2 = random2.Next(0, 11);
            Console.WriteLine($"num={num},num2={num2}");

            Thread.Sleep(1000);
            goto Place;
        }

运行结果:

num=7,num2=7
num=7,num2=7
num=1,num2=1
num=8,num2=8
num=2,num2=2
num=7,num2=7
num=0,num2=0

由以上案例可知,在时间间隔极其接近的时候,生成的随机数是一样的。

2. 生成相对随机的随机数

1. 使用种子值

在这里插入图片描述

在这里插入图片描述
这里通过上面的案例我们发现:通过使用不同的种子值 初始化 Random 类是可以生成 不是完全一样的两个随机序列。那么现在问题就变成了,如何生成唯一的种子值。

  • 方法1
public static int GenerateRandomSeed()
{
	return unchecked((int)DateTime.Now.Ticks);
}
  • 方法2
using System.Text.RegularExpressions;

public static int GenerateRandomSeed()
{
    return Convert.ToInt32(Regex.Match(Guid.NewGuid().ToString(), @"\d+").Value);
}
  • 方法3(推荐)
public static int GenerateRandomSeed()
{
	return Guid.NewGuid().GetHashCode();
}
  • 方法4
using System.Security.Cryptography;

public static int GenerateRandomSeed()
{
    byte[] bytes = new byte[4];
    RNGCryptoServiceProvider rngCSP = new RNGCryptoServiceProvider();
    rngCSP.GetBytes(bytes);
    return BitConverter.ToInt32(bytes, 0);
}

调用和运行结果(随便选择一种种子值的生成方法):
在这里插入图片描述

2. 使用Thread.Sleep(1)

在两个Random 实例化中间增加一个时间为1 毫秒的 延迟即可。
在这里插入图片描述

四、Random 扩展与应用

1. 生成随机的字符

在某些情况下,随机数只能取一些特殊指定的值,如不连续的数字或指定的一些单词等,此时仅用 Random 无法达到要求,必须借助数组才能实现。
实现思路大概是这样:先把这些特殊的值存到数组中,然后把数组的长度作为 Random 的上限产生随机数,此随机数正是数组的下标,根据该下标取得数组的值。

  • 封装成扩展方法来使用
    public static class RandomExtension
    {
        public static string NextString(this Random random, string[] arr)
        {
            var index = random.Next(arr.Length);
            return arr[index];
        }
    }

调用:

        static void Main(string[] args)
        {
            Random random = new Random();
            for (int i = 0; i < 5; i++)
            {
                var str = random.NextString(new string[] { "张三", "李四", "王五","赵六" });
                //var str = random.NextString(new string[] { "黑", "黄", "绿","红" });
                Console.WriteLine($"{str}");
            }
            Console.ReadKey();
        }

运行结果:

张三
王五
王五
张三
张三

2. 生成随机的布尔值

  • 封装成扩展方法来使用
    public static class RandomExtension
    {
        public static bool NextBool(this Random random)
        {
            bool[] boolArr = new bool[] { true, false };
            var index = random.Next(boolArr.Length);
            return boolArr[index];
        }
    }

调用:

        static void Main(string[] args)
        {
            Random random = new Random();
            for (int i = 0; i < 1115; i++)
            {
                var str = random.NextBool();
                Console.WriteLine($"{str}");
            }
            Console.ReadKey();
        }

3. 生成指定范围内浮点随机数

  • 生成指定范围内浮点随机数
double randomDouble = random.NextDouble() * 100; // 生成0到100之间的随机浮点数
Console.WriteLine(randomDouble);

// 生成特定范围内的随机浮点数
double rangeRandomDouble = random.NextDouble() * (maxValue - minValue) + minValue;
Console.WriteLine(rangeRandomDouble); // 假设maxValue和minValue是之前定义的变量

        static void Main(string[] args)
        {
            var random=new Random();
            int min = 100;
            int max = 285;
            for (int i = 0; i < 5; i++)
            {
                var num = random.NextDouble() * (max - min) + min;
                Console.WriteLine($"{num}");
            }
            Console.ReadKey();
        }

运行结果:

126.074954253191
203.064250968427
209.030935270261
208.824055366602
180.678236866686

封装成扩展方法:

    public static class RandomExtension
    {
        public static double NextDouble(this Random random,double min, double max)
        {
            return (random.NextDouble() * (max - min) + min);
        }
    }
  • 生成保留指定小数位数(例如 2 位)的随机数
    public static class RandomExtension
    {
        public static double NextDouble(this Random random, double min, double max,int decimalPlace)
        {
            double randomNum = (random.NextDouble() * (max - min) + min);
            return Convert.ToDouble(randomNum.ToString($"F{decimalPlace}"));
        }
    }

4. 生成一个随机字符串(支持英文大小写字母/数字混合)

    public static class RandomExtension2
    {
        /// <summary>
        /// 生成随机字符串
        /// </summary>
        /// <param name="random">Random 实例</param>
        /// <param name="digits">字符串的长度</param>
        /// <param name="number">是否包括数字</param>
        /// <param name="lowercase">是否包含小写字母</param>
        /// <param name="capital">是否包含大写字母</param>
        /// <param name="special">是否包含特殊字符</param>
        /// <returns></returns>
        public static string GetRandomCharacters(this Random random, int digits = 10, bool number = true, bool lowercase = true, bool capital = true, bool special = false)
        {
            string CapitalLetters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
            string LowercaseLetters = "abcdefghijklmnopqrstuvwxyz";
            string Numbers = "0123456789";
            string SpecialCharacters = "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~";

            StringBuilder tmp = new StringBuilder();
            string characters = (capital ? CapitalLetters : null) + (number ? Numbers : null) + (lowercase ? LowercaseLetters : null) + (special ? SpecialCharacters : null);
            if (characters.Length < 1) return null;
            for (int i = 0; i < digits; i++)
            {
                tmp.Append(characters[random.Next(characters.Length)].ToString());
            }
            return (tmp.ToString());
        }
    }

        /// <summary>
        /// 生成一个随机字符串。
        /// </summary>
        /// <param name="length">生成的字符串长度。</param>
        /// <param name="useUppercase">是否包含大写字母。</param>
        /// <param name="useLowercase">是否包含小写字母。</param>
        /// <param name="useDigits">是否包含数字。</param>
        /// <param name="useSpecialChars">是否包含特殊字符。</param>
        /// <returns>生成的随机字符串。</returns>
        public static string GenerateRandomString(this Random random, int length = 10, bool useUppercase = true, bool useLowercase = true, bool useDigits = true, bool useSpecialChars = false)
        {
            if (length <= 0)
                throw new ArgumentException("长度必须大于零。", nameof(length));

            // 定义字符集合
            var charPool = new StringBuilder();
            if (useUppercase) charPool.Append("ABCDEFGHIJKLMNOPQRSTUVWXYZ");
            if (useLowercase) charPool.Append("abcdefghijklmnopqrstuvwxyz");
            if (useDigits) charPool.Append("0123456789");
            if (useSpecialChars) charPool.Append("!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~");

            if (charPool.Length == 0)
                throw new ArgumentException("至少需要选择一种字符类型。");

            // 生成随机字符串
            var chars = new char[length];
            for (int i = 0; i < length; i++)
            {
                int index = random.Next(0, charPool.Length);
                chars[i] = charPool[index];
            }

            return new string(chars);
        }

调用:

        static void Main(string[] args)
        {
            Random random = new Random();
            for (int i = 0; i < 5; i++)
            {
                var str = random.GenerateRandomString(useSpecialChars:true);
                Console.WriteLine($"{str}");
            }
            Console.ReadKey();
        }

运行结果:

Bz4./WFDM,
mNl0]`p3sL
K&|Vgh"HXV
njXyt3,uit
Ii!fQKm/-;

可以通过方法中的参数配置,生成的字符串的长度以及是否包含大小写字母,特殊字符等,但是并不能保证,一定包含,因此该方法有优化空间。

优化后:

    public static class RandomExtension
    {
        /// <summary>
        /// 生成一个随机字符串。
        /// </summary>
        /// <param name="random">Random 实例</param>
        /// <param name="length">生成的字符串长度。</param>
        /// <param name="useUppercase">是否包含大写字母。</param>
        /// <param name="useLowercase">是否包含小写字母。</param>
        /// <param name="useDigits">是否包含数字。</param>
        /// <param name="useSpecialChars">是否包含特殊字符。</param>
        /// <returns>生成的随机字符串。</returns>
        public static string GenerateRandomString(this Random random, int length = 10, bool useUppercase = true, bool useLowercase = true, bool useDigits = true, bool useSpecialChars = false)
        {
            string CapitalLetters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
            string LowercaseLetters = "abcdefghijklmnopqrstuvwxyz";
            string Numbers = "0123456789";
            string SpecialCharacters = "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~";

            if (length <= 0)
                throw new ArgumentException("长度必须大于零。", nameof(length));

            // 定义字符集合
            var charPool = new StringBuilder();
            var requiredChars = new StringBuilder();

            if (useUppercase)
            {
                charPool.Append(CapitalLetters);
                // 确保至少有一个大写字母,固定值A
                //requiredChars.Append('A'); 
                // 确保至少有一个大写字母,随机值
                requiredChars.Append(CapitalLetters[random.Next(CapitalLetters.Length)]);
            }
            if (useLowercase)
            {
                charPool.Append(LowercaseLetters);
                // 确保至少有一个小写字母,固定值a
                //requiredChars.Append('a'); 
                // 确保至少有一个小写字母,随机值
                requiredChars.Append(LowercaseLetters[random.Next(LowercaseLetters.Length)]);
            }
            if (useDigits)
            {
                charPool.Append(Numbers);
                // 确保至少有一个数字,固定值1
                //requiredChars.Append('1'); 
                // 确保至少有一个数字,随机值
                requiredChars.Append(Numbers[random.Next(Numbers.Length)]);
            }
            if (useSpecialChars)
            {
                charPool.Append(SpecialCharacters);
                // 确保至少有一个特殊字符,固定值!
                //requiredChars.Append('!'); 
                // 确保至少有一个特殊字符,随机值
                requiredChars.Append(SpecialCharacters[random.Next(SpecialCharacters.Length)]);
            }

            if (charPool.Length == 0)
                throw new ArgumentException("至少需要选择一种字符类型。");

            if (requiredChars.Length > length)
                throw new ArgumentException("所需的字符类型数量超过了指定的字符串长度。");

            // 构建确保包含所有必要字符的初始部分
            var result = new StringBuilder();
            foreach (char c in requiredChars.ToString())
            {
                int index = charPool.ToString().IndexOf(c);
                if (index != -1)
                {
                    result.Append(charPool[index]);
                    charPool = charPool.Remove(index, 1); // 移除已使用的字符以避免重复
                }
            }

            // 填充剩余的字符
            for (int i = requiredChars.Length; i < length; i++)
            {
                int index = random.Next(0, charPool.Length);
                result.Append(charPool[index]);
            }

            // 将结果打乱顺序,确保随机性
            var shuffledResult = random.Shuffle(result.ToString());
            return shuffledResult;
        }

        /// <summary>
        /// 打乱字符串中的字符顺序。
        /// </summary>
        /// <param name="random">Random 实例</param>
        /// <param name="input">要打乱的字符串。</param>
        /// <returns>打乱后的字符串。</returns>
        public static string Shuffle(this Random random, string input)
        {
            char[] array = input.ToCharArray();
            for (int i = array.Length - 1; i > 0; i--)
            {
                int j = random.Next(i + 1);
                char temp = array[i];
                array[i] = array[j];
                array[j] = temp;
            }
            return new string(array);
        }
    }

扩展方法:打乱字符串中的字符顺序,也比较实用哦!
调用:

        static void Main(string[] args)
        {
            Random random = new Random();
            for (int i = 0; i < 115; i++)
            {
                var str = random.GenerateRandomString(useSpecialChars:true);
                Console.WriteLine($"{str}");
            }
            Console.ReadKey();
        }

运行结果:

sB9:JtsF-8
M<(:gcW\a3
u>QL&9q3DI
h;#Vmz}aP3
wXbu2L&1B}
2R)[ouG?*q
U)$`28mX3<
LW)}U/t6z`
^P1Q7tl"KZ
4p,@=Y|EV\
=Z%;3mNB\X
]BxY3S.F$r
$-'B~8E;sb
0$V~%N<w;L
eqngCI0Pv.

5. 生成不重复的随机数

1. 基础用法

    public static class RandomExt
    {
        public static int NextUnique(this Random random,Hashtable hashtable,int maxValue)
        {
            if (hashtable == null) throw new ArgumentException("hashtable 不可为空。");
            int num = random.Next(maxValue);
            //不重复,则添加进Hashtable 并返回
            if (!hashtable.ContainsValue(num))
            {
                hashtable.Add(num,num);
                return num;
            }
            //重复,则继续调用自身生成不重复的随机数
            return NextUnique(random,hashtable,maxValue);
        }
    }

调用:

        static void Main(string[] args)
        {
            Hashtable hashtable = new Hashtable();
            Random random = new Random();
            for (int i = 0; hashtable.Count < 20; i++)
            {
                int num = random.NextUnique(hashtable,20);
                Console.WriteLine($"{num}");
            }
        }

2. 进阶用法

基于第四小节的方法,新增一个GenerateRandomStringUnique 方法负责保存和检查唯一性。

    public static class RandomExtension
    {
        /// <summary>
        /// 生成一个随机字符串。
        /// </summary>
        /// <param name="random">Random 实例</param>
        /// <param name="length">生成的字符串长度。</param>
        /// <param name="useUppercase">是否包含大写字母。</param>
        /// <param name="useLowercase">是否包含小写字母。</param>
        /// <param name="useDigits">是否包含数字。</param>
        /// <param name="useSpecialChars">是否包含特殊字符。</param>
        /// <returns>生成的随机字符串。</returns>
        /// <summary>
        /// 生成一个随机字符串。
        /// </summary>
        /// <param name="random">Random 实例</param>
        /// <param name="length">生成的字符串长度。</param>
        /// <param name="useUppercase">是否包含大写字母。</param>
        /// <param name="useLowercase">是否包含小写字母。</param>
        /// <param name="useDigits">是否包含数字。</param>
        /// <param name="useSpecialChars">是否包含特殊字符。</param>
        /// <returns>生成的随机字符串。</returns>
        public static string GenerateRandomString(this Random random, int length = 10, bool useUppercase = true, bool useLowercase = true, bool useDigits = true, bool useSpecialChars = false)
        {
            string CapitalLetters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
            string LowercaseLetters = "abcdefghijklmnopqrstuvwxyz";
            string Numbers = "0123456789";
            string SpecialCharacters = "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~";

            if (length <= 0)
                throw new ArgumentException("长度必须大于零。", nameof(length));

            // 定义字符集合
            var charPool = new StringBuilder();
            var requiredChars = new StringBuilder();

            if (useUppercase)
            {
                charPool.Append(CapitalLetters);
                // 确保至少有一个大写字母,固定值A
                //requiredChars.Append('A'); 
                // 确保至少有一个大写字母,随机值
                requiredChars.Append(CapitalLetters[random.Next(CapitalLetters.Length)]);
            }
            if (useLowercase)
            {
                charPool.Append(LowercaseLetters);
                // 确保至少有一个小写字母,固定值a
                //requiredChars.Append('a'); 
                // 确保至少有一个小写字母,随机值
                requiredChars.Append(LowercaseLetters[random.Next(LowercaseLetters.Length)]);
            }
            if (useDigits)
            {
                charPool.Append(Numbers);
                // 确保至少有一个数字,固定值1
                //requiredChars.Append('1'); 
                // 确保至少有一个数字,随机值
                requiredChars.Append(Numbers[random.Next(Numbers.Length)]);
            }
            if (useSpecialChars)
            {
                charPool.Append(SpecialCharacters);
                // 确保至少有一个特殊字符,固定值!
                //requiredChars.Append('!'); 
                // 确保至少有一个特殊字符,随机值
                requiredChars.Append(SpecialCharacters[random.Next(SpecialCharacters.Length)]);
            }

            if (charPool.Length == 0)
                throw new ArgumentException("至少需要选择一种字符类型。");

            if (requiredChars.Length > length)
                throw new ArgumentException("所需的字符类型数量超过了指定的字符串长度。");

            // 构建确保包含所有必要字符的初始部分
            var result = new StringBuilder();
            foreach (char c in requiredChars.ToString())
            {
                int index = charPool.ToString().IndexOf(c);
                if (index != -1)
                {
                    result.Append(charPool[index]);
                    charPool = charPool.Remove(index, 1); // 移除已使用的字符以避免重复
                }
            }

            // 填充剩余的字符
            for (int i = requiredChars.Length; i < length; i++)
            {
                int index = random.Next(0, charPool.Length);
                result.Append(charPool[index]);
            }

            // 将结果打乱顺序,确保随机性
            var shuffledResult = random.Shuffle(result.ToString());
            return shuffledResult;
        }
        /// <summary>
        /// 打乱字符串中的字符顺序。
        /// </summary>
        /// <param name="random">Random 实例</param>
        /// <param name="input">要打乱的字符串。</param>
        /// <returns>打乱后的字符串。</returns>
        public static string Shuffle(this Random random, string input)
        {
            char[] array = input.ToCharArray();
            for (int i = array.Length - 1; i > 0; i--)
            {
                int j = random.Next(i + 1);
                char temp = array[i];
                array[i] = array[j];
                array[j] = temp;
            }
            return new string(array);
        }

        public static string GenerateRandomStringUnique(this Random random, Hashtable hashtable, int length = 10, bool useUppercase = true, bool useLowercase = true, bool useDigits = true, bool useSpecialChars = false)
        {
            if (hashtable == null) throw new ArgumentException("hashtable 不可为空。");
            string str = random.GenerateRandomString(length, useUppercase, useLowercase, useDigits, useSpecialChars);
            if (!hashtable.ContainsValue(str))
            {
                hashtable.Add(str, str);
                return str;
            }
            return GenerateRandomStringUnique(random, hashtable, length, useUppercase, useLowercase, useDigits, useSpecialChars);
        }
    }

调用

        static void Main(string[] args)
        {
            Hashtable hashtable = new Hashtable();
            Random random = new Random();
            // 只生成 1 个长度的只包含数字的 随机数的时候,只可能生成9个值,超过会报错
            // 只生成 2 个长度的只包含数字的 随机数的时候,只可能生成10~99之间的值,总共89个值,超过会报错
            for (int i = 0; hashtable.Count < 89; i++)
            {
                string result = random.GenerateRandomStringUnique(hashtable,2,false,false,true,false);
                Console.WriteLine($"{result}");
            }
        }

正常调用,生成长度10的包含大小写字母,包含数字,不含特殊字符的随机数

        static void Main(string[] args)
        {
            Hashtable hashtable = new Hashtable();
            Random random = new Random();
            for (int i = 0; hashtable.Count < 15; i++)
            {
                string result = random.GenerateRandomStringUnique(hashtable);
                Console.WriteLine($"{result}");
            }
        }

运行结果:

lf41aCkdME
jFyHlT1UAr
Ni4y2JjAiQ
XJWbG2wK9e
Rn7j5bhFTO
hl7IWQ2LGC
016VCkgYzJ
D1KIgJeMQt
9TQJ5U4xTR
VcCVXJU76N
5wKRz1JrXI
RpJEn9MWhz
PiUQK4Xm7C
JfqK5pIadf
08Xy5SrQpp

结语

回到目录页: C# 知识汇总
希望以上内容可以帮助到大家,如文中有不对之处,还请批评指正。


参考资料:
.NET文档 - Random 类
C# Random类详解:生成随机数的实用指南
总结全网C#取随机数方法(整型,浮点型,字符串)
C# Random 随机数
C#产生指定范围随机数(整数、小数、字符、布尔,相对不重复的和唯一的)的几种方法

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

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

相关文章

Linux网络——UDP的运用

Linux网络——UDP的运用 文章目录 Linux网络——UDP的运用一、引入二、服务端实现2.1 创建socket套接字2.2 绑定bind2.3 启动服务器2.4 IP的绑定的细节2.5 读取数据recvfrom 三、用户端实现3.1 绑定问题3.2 发送数据sendto 四、代码五、UDP实现网络聊天室&#xff08;简易版&am…

IDEA使用Alt + Enter快捷键自动接受返回值一直有final修饰的问题处理

在使用IDEA的过程中&#xff0c;使用快捷键Alt Enter在接收返回值时&#xff0c;可以快速完成参数接收&#xff0c;但前面一直会出现接收参数前面有final修饰的情况&#xff0c;效果如下所示&#xff1a; 看着真烦人呢&#xff0c;我们会发现在接受到返回值是上方有个 Declare…

【小白51单片机专用教程】protues仿真AT89C51入门

课程特点 无需开发板0基础教学软件硬件双修辅助入门 本课程面对纯小白&#xff0c;因此会对各个新出现的知识点在实例基础上进行详细讲解&#xff0c;有相关知识的可以直接跳过。课程涉及protues基本操作、原理图设计、数电模电、kell使用、C语言基本内容&#xff0c;所有涉及…

软件设计与体系结构

1.简要说明什么是软件体系结构&#xff0c;软件体系结构模型&#xff0c;为什么要建立软件体系结构模型&#xff1f; 答&#xff1a;软件体系结构指一个软件系统在高层次上的结构化组织方式&#xff0c;包括系统的组成部分和各个部分之间的关系&#xff0c;以及它们与环境之间的…

位置式PID-控制步进电机-位置环-stm32

基本原理 1、软件设计 本闭环控制例程是在步进电机编码器测速例程的基础上编写的,这里只讲解核心的部分代码,有些变量的设置,头文件的包含等并没有涉及到,完整的代码请参考本章配套的工程。 我们创建了4个文件:bsp_pid.c和bsp_pid.h文件用来存放PID控制器相关程序,bsp_s…

汽车IVI中控开发入门及进阶(47):CarPlay开发

概述: 车载信息娱乐(IVI)系统已经从仅仅播放音乐的设备发展成为现代车辆的核心部件。除了播放音乐,IVI系统还为驾驶员提供导航、通信、空调、电源配置、油耗性能、剩余行驶里程、节能建议和许多其他功能。 ​ 驾驶座逐渐变成了你家和工作场所之外的额外生活空间。2014年,…

电力通信规约-104实战

电力通信规约-104实战 概述 104规约在广泛应用于电力系统远动过程中&#xff0c;主要用来进行数据传输和转发&#xff0c;本文将结合实际开发实例来讲解104规约的真实使用情况。 实例讲解 因为个人技术栈是Java&#xff0c;所以本篇将采用Java实例来进行讲解。首先我们搭建一…

AWS Transfer 系列:简化文件传输与管理的云服务

在数字化转型的今天&#xff0c;企业对文件传输、存储和管理的需求日益增长。尤其是对于需要大量数据交换的行业&#xff0c;如何高效、可靠地传输数据成为了一大挑战。为了解决这一难题&#xff0c;AWS 提供了一系列的文件传输服务&#xff0c;统称为 AWS Transfer 系列。这些…

动态规划<四> 回文串问题(含对应LeetcodeOJ题)

目录 引例 其余经典OJ题 1.第一题 2.第二题 3.第三题 4.第四题 5.第五题 引例 OJ 传送门Leetcode<647>回文子串 画图分析&#xff1a; 使用动态规划解决 原理&#xff1a;能够将所有子串是否是回文的信息保存在dp表中 在使用暴力方法枚举出所有子串&#xff0c;是…

stm32定时器输出比较----驱动步进电机

定时器输出比较理论 OC(Output Compare)输出比较输出比较可以通过比较CNT与CCR寄存器值的关系,来对输出电平进行置1、置0或翻转的操作,用于输出一定频率和占空比的PWM波形每个高级定时器和通用定时器都拥有4个输出比较通道高级定时器的前3个通道额外拥有死区生成和互补输出…

Windows电脑部署SD 3.5结合内网穿透随时随地生成高质量AI图像

文章目录 前言1. 本地部署ComfyUI2. 下载 Stable Diffusion3.5 模型3. 演示文生图4. 公网使用Stable Diffusion 3.5 大模型4.1 创建远程连接公网地址 5. 固定远程访问公网地址 前言 在数字化创意时代&#xff0c;AI技术的发展为我们带来了无限可能。尤其是对于那些追求高效和高…

Easysearch Java SDK 2.0.x 使用指南(二)

在 上一篇文章 中&#xff0c;我们介绍了 Easysearch Java SDK 2.0.x 的基本使用和批量操作。本文将深入探讨索引管理相关的功能&#xff0c;包括索引的创建、删除、开关、刷新、滚动等操作&#xff0c;以及新版 SDK 提供的同步和异步两种调用方式。 SDK 的对象构建有两种方式…

Scala——身份证号码查询籍贯

object Test_身份证查询籍贯 { def main(args: Array[String]): Unit { val code "42005200210030051".substring(0,2) println(code) //判断42是哪个省的 //湖北 // if(code "42"){ // println("42对应省份为&#xff1a;湖北") // }else…

分布式系统架构:限流设计模式

1.为什么要限流&#xff1f; 任何一个系统的运算、存储、网络资源都不是无限的&#xff0c;当系统资源不足以支撑外部超过预期的突发流量时&#xff0c;就应该要有取舍&#xff0c;建立面对超额流量自我保护的机制&#xff0c;而这个机制就是微服务中常说的“限流” 2.四种限流…

2024年11月 蓝桥杯青少组 STEMA考试 Scratch真题

2024年11月 蓝桥杯青少组 STEMA考试 Scratch真题&#xff08;选择题&#xff09; 题目总数&#xff1a;5 总分数&#xff1a;50 选择题 第 1 题 单选题 Scratch运行以下程宇后&#xff0c;小兔子会&#xff08; &#xff09;。 A. 变小 B. 变大 C. 变色 D. …

Pytorch | 从零构建ParNet/Non-Deep Networks对CIFAR10进行分类

Pytorch | 从零构建ParNet/Non-Deep Networks对CIFAR10进行分类 CIFAR10数据集ParNet架构特点优势应用 ParNet结构代码详解结构代码代码详解SSEParNetBlock 类DownsamplingBlock 类FusionBlock 类ParNet 类 训练过程和测试结果代码汇总parnet.pytrain.pytest.py 前面文章我们构…

Docker核心技术和实现原理

目录 1. Docker镜像原理介绍1.1 操作系统基础1.2 Union FS(联合文件系统)1.3 再看 Docker 镜像是什么 2. 镜像的实现原理2.1 Docker 分层存储实现原理2.2 docker 镜像加载原理 3. 镜像分层存储实战3.1 基础知识3.2 实战过程 4. overlay 文件系统工作实战5. Docker卷原理介绍5.1…

AI的进阶之路:从机器学习到深度学习的演变(二)

AI的进阶之路&#xff1a;从机器学习到深度学习的演变&#xff08;一&#xff09; 三、机器学习&#xff08;ML&#xff09;&#xff1a;AI的核心驱动力 3.1 机器学习的核心原理 机器学习&#xff08;Machine Learning, ML&#xff09;突破了传统编程的局限&#xff0c;它不再…

34.正则表达式

python正则表达式&#xff0c;使用re模块&#xff0c;模块中三个基础方法来做正则匹配。 match re.match(匹配规则&#xff0c; 被匹配的字符串) 从字符串开头进行匹配&#xff0c;匹配成功返回匹配对象&#xff08;包含匹配的信息&#xff09;&#xff0c;匹配不成功返回空。…

xpath插件安装与使用

1.背景 在使用python爬取页面数据时,经常会遇到解析页面数据,有一个非常好用的插件工具 是:xpath插件 2.安装与使用步骤 步骤1:准备xpath插件,并解压 步骤2:添加扩展程序 点击扩展程序后: 点击:加载已解压的扩展程序 安装成功后: 关闭浏览器,重新打开浏览器就可以使用了 步…