首页 > 其他分享 >探索Go语言中的随机数生成、矩阵运算与数独验证

探索Go语言中的随机数生成、矩阵运算与数独验证

时间:2024-09-11 13:24:37浏览次数:3  
标签:return err int fmt arguments 随机数 Go 数独

1. Go中的随机数生成

在许多编程任务中,随机数的生成是不可或缺的。Go语言通过 math/rand 包提供了伪随机数生成方式。伪随机数由种子(seed)决定,如果种子相同,生成的数列也会相同。为了确保每次程序运行时产生不同的随机数,我们通常使用当前时间作为种子。

示例1:简单的随机数生成
package main

import (
	"fmt"
	"math/rand"
	"time"
)

func random(min, max int) int {
	return rand.Intn(max-min) + min
}

func main() {
	rand.Seed(time.Now().Unix())
	for i := 0; i < 5; i++ {
		fmt.Println("生成的随机数:", random(0, 100))
	}
}

上述程序使用了当前时间作为种子来生成0到100之间的5个随机数。输出结果每次都会不同。

示例2:通过命令行控制随机数生成

为了使程序更具灵活性,我们可以通过命令行传入参数来控制随机数的生成范围和数量,甚至可以指定种子来生成固定序列的伪随机数。

package main

import (
	"fmt"
	"math/rand"
	"os"
	"strconv"
	"time"
)

func random(min, max int) int {
	return rand.Intn(max-min) + min
}

func main() {
	MIN := 0
	MAX := 100
	TOTAL := 10
	SEED := time.Now().Unix()
	arguments := os.Args

	switch len(arguments) {
	case 2:
		MIN, _ = strconv.Atoi(arguments[1])
		MAX = MIN + 100
	case 3:
		MIN, _ = strconv.Atoi(arguments[1])
		MAX, _ = strconv.Atoi(arguments[2])
	case 4:
		MIN, _ = strconv.Atoi(arguments[1])
		MAX, _ = strconv.Atoi(arguments[2])
		TOTAL, _ = strconv.Atoi(arguments[3])
	case 5:
		MIN, _ = strconv.Atoi(arguments[1])
		MAX, _ = strconv.Atoi(arguments[2])
		TOTAL, _ = strconv.Atoi(arguments[3])
		SEED, _ = strconv.ParseInt(arguments[4], 10, 64)
	default:
		fmt.Println("使用默认值")
	}

	rand.Seed(SEED)

	for i := 0; i < TOTAL; i++ {
		fmt.Printf("%d ", random(MIN, MAX))
	}
	fmt.Println()
}

通过不同的命令行参数,可以控制生成的随机数。例如:

$ go run randomNumbers.go 10 50 5
14 37 27 49 16

这段代码生成了5个在10到50之间的随机数。

2. 加密级别的随机数生成

在安全领域,生成密码时,伪随机数不足以提供安全性。Go提供了 crypto/rand 包来生成加密安全的随机数,它可以生成不可预测的随机序列。

示例3:生成加密安全的随机密码
package main

import (
	"crypto/rand"
	"encoding/base64"
	"fmt"
	"os"
	"strconv"
)

func generateBytes(n int64) ([]byte, error) {
	b := make([]byte, n)
	_, err := rand.Read(b)
	if err != nil {
		return nil, err
	}
	return b, nil
}

func generatePass(s int64) (string, error) {
	b, err := generateBytes(s)
	return base64.URLEncoding.EncodeToString(b), err
}

func main() {
	var LENGTH int64 = 8
	arguments := os.Args

	if len(arguments) == 2 {
		LENGTH, _ = strconv.ParseInt(arguments[1], 10, 64)
	}

	myPass, err := generatePass(LENGTH)
	if err != nil {
		fmt.Println("生成密码失败:", err)
		return
	}

	fmt.Println("生成的密码:", myPass[0:LENGTH])
}

运行程序后会生成一个随机密码,例如:

生成的密码: Zm9yQ29kZT==

3. 矩阵运算与生成

矩阵在图像处理、机器学习等领域中有广泛应用。我们可以利用Go语言生成随机矩阵,并进行矩阵加法、减法等运算。

示例4:生成随机矩阵并进行矩阵加法
package main

import (
	"fmt"
	"math/rand"
	"time"
)

func generateMatrix(row, col int) [][]int {
	matrix := make([][]int, row)
	for i := range matrix {
		matrix[i] = make([]int, col)
		for j := range matrix[i] {
			matrix[i][j] = rand.Intn(10)
		}
	}
	return matrix
}

func addMatrices(m1, m2 [][]int) [][]int {
	result := make([][]int, len(m1))
	for i := range m1 {
		result[i] = make([]int, len(m1[i]))
		for j := range m1[i] {
			result[i][j] = m1[i][j] + m2[i][j]
		}
	}
	return result
}

func main() {
	rand.Seed(time.Now().Unix())

	m1 := generateMatrix(3, 3)
	m2 := generateMatrix(3, 3)

	fmt.Println("矩阵1:", m1)
	fmt.Println("矩阵2:", m2)

	result := addMatrices(m1, m2)
	fmt.Println("矩阵加法结果:", result)
}

通过上述代码,您可以生成两个3x3的随机矩阵,并执行矩阵加法运算。

4. 数独验证程序

数独是一个流行的逻辑益智游戏,要求将1到9填入一个9x9的网格中,使每行、每列和每个3x3的子区域都包含不重复的数字。我们可以通过编写程序验证数独是否解得正确。

示例5:数独验证
package main

import (
	"bufio"
	"errors"
	"fmt"
	"os"
	"strconv"
	"strings"
)

func importFile(file string) ([][]int, error) {
	var err error
	var mySlice = make([][]int, 0)
	f, err := os.Open(file)
	if err != nil {
		return nil, err
	}
	defer f.Close()
	r := bufio.NewReader(f)
	for {
		line, err := r.ReadString('\n')
		fields := strings.Fields(line)
		temp := make([]int, 0)
		for _, v := range fields {
			n, err := strconv.Atoi(v)
			if err != nil {
				return nil, err
			}
			temp = append(temp, n)
		}
		if len(temp) != 0 {
			mySlice = append(mySlice, temp)
		}
		if err != nil {
			break
		}
	}
	return mySlice, nil
}

func validPuzzle(sl [][]int) bool {
	for i := 0; i <= 2; i++ {
		for j := 0; j <= 2; j++ {
			iEl := i * 3
			jEl := j * 3
			mySlice := []int{0, 0, 0, 0, 0, 0, 0, 0, 0}
			for k := 0; k <= 2; k++ {
				for m := 0; m <= 2; m++ {
					bigI := iEl + k
					bigJ := jEl + m
					val := sl[bigI][bigJ]
					if val > 0 && val < 10 {
						if mySlice[val-1] == 1 {
							fmt.Println("数字出现两次:", val)
							return false
						} else {
							mySlice[val-1] = 1
						}
					} else {
						fmt.Println("无效值:", val)
						return false
					}
				}
			}
		}
	}

	for i := 0; i <= 8; i++ {
		sum := 0
		for j := 0; j <= 8; j++ {
			sum = sum + sl[i][j]
		}
		if sum != 45 {
			return false
		}
		sum = 0
	}

	for i :=

 0; i <= 8; i++ {
		sum := 0
		for j := 0; j <= 8; j++ {
			sum = sum + sl[j][i]
		}
		if sum != 45 {
			return false
		}
		sum = 0
	}

	return true
}

func main() {
	arguments := os.Args
	if len(arguments) != 2 {
		fmt.Printf("使用: loadFile 文件名\n")
		return
	}
	file := arguments[1]
	mySlice, err := importFile(file)
	if err != nil {
		fmt.Println(err)
		return
	}

	if validPuzzle(mySlice) {
		fmt.Println("数独正确!")
	} else {
		fmt.Println("数独错误!")
	}
}

通过此程序,您可以从文件导入一个数独,并验证其是否解得正确。输入数独文件格式为9x9的数独矩阵,每行数字间以空格分隔。

运行程序:

$ go run sudoku.go valid_sudoku.txt
数独正确!

结论

通过本文的学习,读者不仅能掌握如何在Go语言中生成随机数,还能学会如何生成加密安全的随机数、矩阵运算以及数独验证等高级技术。Go语言为我们提供了丰富的工具,能轻松应对多种编程挑战。

标签:return,err,int,fmt,arguments,随机数,Go,数独
From: https://blog.csdn.net/nokiaguy/article/details/142137102

相关文章

  • Study Plan For Algorithms - Part28
    1.跳跃游戏题目链接:https://leetcode.cn/problems/jump-game/给定一个非负整数数组nums,你最初位于数组的第一个下标。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标,如果可以,返回true;否则,返回false。classSolution:defca......
  • Study Plan For Algorithms - Part29
    1.在排序数组中查找数字统计一个数字在排序数组中出现的次数。方法一:defsearch(nums,target):returnhelper(nums,target)-helper(nums,target-1)defhelper(nums,target):i=0j=len(nums)-1whilei<=j:m=(i+j)//......
  • CloudFire+PicGo搭建免费图床
    目录CloudFire对象存储创建bucket配置域名配置Bucket访问APIPicGO配置CloudFire对象存储|CloudFire提供对象存储服务,每个月有10G的免费额度,并且直连稳定可靠,无需CDN加速,足够作为日常图床使用。创建bucket打开CloudFire官网并注册账号,点击R2存储。创建图床bucket地区可......
  • Go runtime 调度器精讲(一):Go 程序初始化
    原创文章,欢迎转载,转载请注明出处,谢谢。0.前言本系列将介绍Goruntime调度器。要学好Go语言,runtime运行时是绕不过去的,它相当于一层“操作系统”对我们的程序做“各种类型”的处理。其中,调度器作为运行时的核心,是必须要了解的内容。本系列会结合Goplan9汇编,深入到runt......
  • Django路由
    一、路由定义URL与Django视图建立映射关系,根据用户请求的URL链接来判断对应的处理程序,并返回处理结果二、使用步骤1.路由使用#path:用于普通路径,不需要自己手动添加正则首位限制符号,底层已添加#普通路径path('index',views.index),#fromdjango.urlsimportre_......
  • Django视图
    一、视图是什么视图函数,接受Web请求并且返回Web响应二、常用的request属性1、GET项目index.py添加方法:defrequest_get(request):#get():返回字符串,如果该键对应有多个值,取出该键的最后一个值#getlist():返回列表,如果该键对应有多个值,取出所有值......
  • (转)万字长文——Go 语言现代命令行框架 Cobra 详解
    原文:https://juejin.cn/post/7231197051203256379Cobra是一个Go语言开发的命令行(CLI)框架,它提供了简洁、灵活且强大的方式来创建命令行程序。它包含一个用于创建命令行程序的库(Cobra库),以及一个用于快速生成基于Cobra库的命令行程序工具(Cobra命令)。Cobra是由Go团队成员......
  • 计算机毕业设计PySpark+Django深度学习游戏推荐系统 游戏可视化 游戏数据分析 游戏爬
    在撰写《PySpark+Django深度学习游戏推荐系统》的开题报告时,建议包括以下内容:###1.研究背景与意义在数字娱乐行业中,游戏推荐系统成为提升用户体验的关键工具。现有的推荐系统大多基于用户行为数据进行推荐,但随着数据量的急剧增加和数据复杂性的提升,传统的推荐算法面临挑战......
  • 3天学会golang的基础语法
     1.视频资料在线观看:【尚硅谷】Golang入门到实战教程丨一套精通GO语言_哔哩哔哩_bilibili2.学习目录 001_尚硅谷_Golang可以做什么.mp4002_尚硅谷_如何学习Golang更高效(1).mp4003_尚硅谷_如何学习Golang更高效(2).mp4004_尚硅谷_程序的基本概念.mp4005_尚硅谷_Go语......
  • MongoDB延迟查询
    在MongoDB中,查看副本集成员之间的副本延迟可以通过以下步骤进行:使用rs.status()命令:这个命令提供了副本集的详细状态信息,包括每个成员的延迟情况。在MongoDBshell中,你可以执行以下命令:rs.status()这个命令会返回一个包含副本集所有成员状态的对象。在返回的对......