如何正确播种随机数生成器

2023-12-10

我正在尝试在 Go 中生成一个随机字符串,这是我到目前为止编写的代码:

package main

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

func main() {
    fmt.Println(randomString(10))
}

func randomString(l int) string {
    var result bytes.Buffer
    var temp string
    for i := 0; i < l; {
        if string(randInt(65, 90)) != temp {
            temp = string(randInt(65, 90))
            result.WriteString(temp)
            i++
        }
    }
    return result.String()
}

func randInt(min int, max int) int {
    rand.Seed(time.Now().UTC().UnixNano())
    return min + rand.Intn(max-min)
}

我的实施速度非常慢。播种使用time在一定时间内带来相同的随机数,因此循环一次又一次地迭代。我该如何改进我的代码?


每次设置相同的种子时,您都会得到相同的序列。因此,当然,如果您在快速循环中将种子设置为时间,则可能会使用相同的种子多次调用它。

就你而言,当你打电话给你的randInt函数直到你有一个不同的值,你正在等待时间(由 Nano 返回)改变。

对于所有伪随机库,您只需设置种子一次,例如在初始化程序时,除非您特别需要重现给定的序列(通常仅用于调试和单元测试)。

之后你只需调用Intn得到下一个随机整数。

移动rand.Seed(time.Now().UTC().UnixNano())从 randInt 函数到 main 函数的开头,一切都会变得更快。并失去.UTC()致电自:

UnixNano 返回 t 作为 Unix 时间,即自 UTC 1970 年 1 月 1 日以来经过的纳秒数。

另请注意,我认为您可以简化字符串构建:

package main

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

func main() {
    rand.Seed(time.Now().UnixNano())
    fmt.Println(randomString(10))
}

func randomString(l int) string {
    bytes := make([]byte, l)
    for i := 0; i < l; i++ {
        bytes[i] = byte(randInt(65, 90))
    }
    return string(bytes)
}

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

如何正确播种随机数生成器 的相关文章

  • 打印到 stdout 会导致阻塞的 goroutine 运行吗?

    作为一个愚蠢的基本线程练习 我一直在尝试实现理发师睡觉的问题 http en wikipedia org wiki Sleeping barber problem在戈兰 对于通道来说 这应该很容易 但我遇到了一个 heisenbug 也就是
  • go中有memset的类似物吗?

    在 C 中 我可以使用某些值初始化数组memset https msdn microsoft com en us library aa246471 28v vs 60 29 aspx const int MAX 1000000 int is
  • 如何在C++中生成高精度的随机双数?

    我正在尝试生成一系列高精度的双随机数 例如 0 856365621 小数点后有 9 位数字 我从网上找到了一些方法 但是 它们确实生成了双随机数 但精度没有我要求的那么好 只有小数点后6位 那么 我可以知道如何实现我的目标吗 在 C 11
  • 如何将 int[] 转换为 uint8[]

    所以 我需要你的帮助 我找不到关于该主题的任何内容 Golang 是一门刚刚诞生的语言 所以对于像我这样的新手来说很难快速找到答案 预先声明的 Goint类型大小是特定于实现的 32 位或 64 位 数字类型 http golang org
  • Linq2sql:获取具有权重的随机元素的有效方法?

    Byt 可以说我有一个整数权重 即权重为 10 的元素被选择的概率是权重为 1 的元素的 10 倍 var ws db WorkTypes Where e gt e HumanId null e SeoPriority 0 OrderBy
  • 这个方法比 Math.random() 更快吗?

    我是一名初学者 目前已经开始开发一款使用粒子群优化算法的 Android 游戏 我现在正在尝试稍微优化我的代码 并且 for 循环中有相当多的 Math random 几乎一直在运行 所以我正在考虑一种方法来绕过并跳过所有 Math ran
  • Golang中按长度分割字符串

    有谁知道如何在 Golang 中按长度分割字符串 例如 每 3 个字符分割 helloworld 那么理想情况下它应该返回一个 hel low orl d 数组 或者 一个可能的解决方案是在每 3 个字符后附加一个换行符 所有的想法都非常感
  • 直接从一个通道发送到另一个通道

    当从一个通道直接发送到另一个通道时 我偶然发现了令人惊讶的行为 package main import fmt func main my chan make chan string chan of chans make chan chan
  • 如何同时使用 LoadHTMLGlob 和 LoadHTMLFiles

    我想要来自不同子目录的分隔符逻辑模板templates文件夹 下面是我的templates文件夹 templates authentication login gohtml logout gohtml index gohtml profil
  • 在 C# 中创建加密随机数的最快、线程安全的方法?

    请注意 在多个线程上并行生成随机数时 加密随机数生成器不是线程安全的 使用的发电机是RNGCryptoServiceProvider它似乎重复了很长一段随机位 128 位 重现此情况的代码如下所示 缺乏使用锁来保护访问RNGCryptoSe
  • 如何关闭 gorm 1.20.0 中的数据库实例

    由于我没有在 Close 函数中找到 gorm 实例 任何帮助将不胜感激 dbURI fmt Sprintf user s password s dbname s port s sslmode s TimeZone s username p
  • 在 Gorilla Mux 中嵌套子路由器

    我一直在使用gorilla mux https github com gorilla mux满足我的路由需求 但我注意到一个问题 当我嵌套多个子路由器时它不起作用 这是示例 func main r mux NewRouter StrictS
  • 如何从 JWT 令牌中提取声明

    我正在使用 dgrijalva jwt go 包 我想从令牌中提取有效负载 但找不到方法 示例 取自 https jwt io https jwt io 对于编码 eyJhbGciOiJIUZI1NiIsInR5cCI6IkpXVCJ9 e
  • C++ 为伪随机数生成器生成良好的随机种子

    我正在尝试为伪随机数生成器生成一个好的随机种子 我想我应该得到专家的意见 让我知道这是否是一个不好的方法或者是否有更好的方法 include
  • 加密安全随机数生成器如何工作?

    我了解标准随机数生成器的工作原理 但在使用密码学时 随机数确实必须是随机的 我知道有一些仪器可以读取宇宙白噪声 http en wikipedia org wiki Hardware random number generator帮助生成安
  • 与通道相比,sync.WaitGroup 的优势是什么?

    我正在开发一个并发 Go 库 我偶然发现了 goroutine 之间两种不同的同步模式 其结果相似 等待组 https play golang org p ZYPLlcp16TZ package main import fmt sync t
  • 解压文件的简单方法

    有没有一种简单的方法可以用 Go 解压文件 现在我的代码是 func Unzip src dest string error r err zip OpenReader src if err nil return err defer r Cl
  • 如何从枚举中选择随机值?

    给定 C 中的任意枚举 如何选择随机值 我没有找到这个非常基本的问题 我会在一分钟内发布我的答案作为任何人的参考 但请随意发布你自己的答案 Array values Enum GetValues typeof Bar Random rand
  • 如何在 Go 中填写 void* C 指针?

    我正在尝试与 Go 中的一些 C 代码交互 使用 cgo 这一直相对简单 直到我遇到这种 相当常见 的情况 需要将指针传递给本身包含指向某些数据的指针的结构 我似乎无法弄清楚如何从 Go 中做到这一点 而不诉诸于将结构的创建放入 C 代码本
  • 单值上下文中的多值错误

    我在编译 GO 代码时遇到此错误 multiple value fmt Println in single value context 我正在尝试创建一个函数 该函数接受可变数量的整数并将每个变量打印在一行上 GO package main

随机推荐

  • SQL中根据日期计算列数

    我需要有关 SQL 语句的帮助 目标是统计每个日期的警报数量 我的桌子看起来像这样 DATE COUNTER ALARM ID 2012 01 01 30 1 2012 01 01 20 2 2012 01 01 10 3 2012 01
  • 如何解决ASEC_CREATE权限问题?

    我无法再在手机中部署我的项目 我不知道是因为我更新了Gradle还是更新了我的手机系统 或者两者兼而有之 错误信息是这样的 Error installing split apks com android ddmlib InstallExce
  • 序列点和运算符优先级之间的区别? 0_o

    让我举一个例子 a a 据说上面的语句有未定义的行为 我已经阅读了关于 UB on SO 的文章 但根据优先规则运算符前缀 优先级高于赋值运算符 so a应首先递增 然后分配回 a 那么每一个评价都是已知的 那为什么是UB呢 这里要理解的重
  • 在 MVC 3 中,如果不显眼的验证无效则显示 div,如果有效则隐藏它

    这是我的编辑视图的一部分 dt Html LabelFor model gt model MainModel StartDate dt dd Html TextBoxFor model gt model MainModel StartDat
  • 如何使用“纯 DOM”在根标记处设置名称空间(xmlns)声明?

    错误 未捕获异常 DOMException 消息 命名空间错误 dom new DOMDocument 1 0 utf 8 root dom gt createElement MyRoot Hello root gt setAttribut
  • 如何在 Emacs Lisp 中使用 Slime 运行 Common Lisp 代码

    出于某种原因 我编写了一些 Common Lisp 代码来完成我想要的操作 我使用 QuickLisp 和 Slime 现在我希望能与Emacs Lisp集成 我尝试使用 slime slime eval region start end
  • 将上下文无关语法转换为正则表达式

    我目前正在查看 CFG 并看到答案 但我不确定他们是如何得到它的 他们是如何将其从 CFG 转换为正则表达式的 S gt aS bX a X gt aX bY a Y gt aY a answer R E gt a a ba a ba ba
  • 输入时清除 EditText 中的文本[重复]

    这个问题在这里已经有答案了 我正在尝试设置 onclicklistener 以便当我在 edittext 元素中单击时 它将清除其当前内容 这里有什么问题吗 当我编译此代码时 我收到强制退出和 ActivityManager Can t s
  • Watson 使用一个 API 代码进行响应

    我知道如果我想在对话中向 Watson 发送任何内容 我可以使用 var latestResponse Api getResponsePayload var context latestResponse context Api sendRe
  • 如何创造无限可数的Times?

    我希望能够将 Ruby 中的 Enumerable 对象扩展为星期一的无限列表 例如 所以它会产生 3月29日 4月5日 4月12日 等等 我如何在 Ruby 中实现这个 在 1 9 中 可能以前的版本使用backports 您可以轻松创建
  • DataGridView 仅包含数字单元格?

    我是 winforms 新手 我正在尝试将 DataGridView 的两列设置为仅数字 我不希望用户能够在单元格中键入任何内容 除非它在一列中是自然数 而在另一列中是数值 始终是一位小数 我认为这很简单 但即使在尝试了 stackover
  • 在 PHP 中显示数据库中的复选框值

    在数据库中我有一列 语言 有价值观的English Arabic Urdu分别 现在 我正在获取这些值并在复选框中显示这些值以进行更新 我必须检查该复选框是否与数据库值匹配 然后将其选中 否则取消选中 但我得到了错误的结果 下面的代码对于从
  • 泽西岛 2.32 IllegalArgumentException jersey.repackaged.org.objectweb.asm.ClassVisitor

    我正在尝试使用 Jersey 的 JSON bean 验证 但是在初始化 servlet 时发生错误 完整的堆栈跟踪 SEVERE Servlet init for servlet rest servlet threw exception
  • Android 4.x 方向与phonegap

    我有一个带有phonegap 1 3和jquerymobile 1 0的网络应用程序 它可以在除4 0之外的所有Android版本上运行良好 事实上 如果我改变方向 应用程序会强制关闭 没有错误 也没有 据我所知 logcat 错误 如果我
  • 如何在android中排序List

    List
  • 使用 writeLines 时避免文件末尾出现空行

    在 R 中 是否可以避免 writeLines 生成的文本文件末尾出现空行 如果没有 是否有其他方法可以从 R 中生成文本文件而末尾不带空行 没有空行 R 正确地 以以下方式结束每一行 n or r n 在 Windows 上 换句话说 文
  • C# 循环遍历文件夹直到找到正确的文件

    我正在运行一个批处理来更新我的 sql 表 我正在使用 Windows 调度程序来运行批处理文件 每天文件在不同的时间到达 有时它们在我的计划时间之后进入 因此当文件夹中的计划任务之前没有文件时 批处理文件不会运行 我想创建一个 C 程序
  • 将一个表中的类别附加到另一个 MySQL 中的条目

    我有一个数据库 它接受用户提交的数据 我想将这些条目分组到大约 10 个类别中的一个或多个类别中 例如 您将您的条目添加到我的网站 说这一切都与您的业务 汽车代客服务 有关 我为您提供机会将您的条目分类为任意 10 个固定类别 汽车 移动服
  • 如何制作对象的防御性副本?

    如何制作包含不可变对象中的可变字段的可变对象的防御性副本 class ImmutableObject private final MutableObject immutable field ImmutableObject MutableOb
  • 如何正确播种随机数生成器

    我正在尝试在 Go 中生成一个随机字符串 这是我到目前为止编写的代码 package main import bytes fmt math rand time func main fmt Println randomString 10 fu