【Golang】生成不重复的随机数据
3## 一、踩过的坑
刚开始生成百万条数据,我用的是redis存储读取的方式验证是否有重复数据。
随着数据量的增长,这种方式实在效率低,对系统性能不友好,因此放弃Redis。
使用for循环逐个验证也不太行,当数据量到达百万条时,每生成一条数据就要执行最多100万次的循环,这显然是在浪费资源。
现在采用key:value形式,绝对是更好的方法,尤其在大规模数据生成时,只读取一次就判断出了数据是否重复。
二、更好的例子 :
package main
import (
"bufio"
"fmt"
"math/rand"
"os"
)
var uniqueMap1 = make(map[string]bool)
func main() {
data := []string{}
// 10000万数据
for i := 0; i < 100000; i++ {
data = append(data, generateRandomString())
}
write(data)
}
// 生成不重复的数据
func generateRandomString() string {
charSet := "abcdefghijklmnopqrstuvwxyz0123456789"
charSetLen := len(charSet)
randomString := make([]byte, 5)
result := ""
for result == "" || uniqueMap1[result] {
for i := range randomString {
randomString[i] = charSet[rand.Intn(charSetLen)]
}
result = string(randomString)
}
uniqueMap1[result] = true
return result
}
// 将[]string写入txt
func write(data []string) {
file, err := os.Create("output.txt")
if err != nil {
fmt.Println("创建文件出错:", err)
return
}
defer file.Close()
writer := bufio.NewWriter(file)
for _, line := range data {
_, err := writer.WriteString(line + "\n")
if err != nil {
fmt.Println("写入出错:", err)
return
}
}
err = writer.Flush()
if err != nil {
fmt.Println("Error flushing writer:", err)
return
}
fmt.Println("完成")
}