golang 生成随机数,时间种子改进型

直接上代码:

var (
    randSeek = int64(1)
    l        sync.Mutex
)
//获取指定长度的随机字符串
//@params num int 生成的随机字符串的长度
//@params str string 可选,指定随机的字符串
func GetRandomSring(num int, str ...string) string {
    s := "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
    if len(str) > 0 {
        s = str[0]
    }
    l := len(s)
    r := rand.New(rand.NewSource(getRandSeek()))

    var buf bytes.Buffer
    for i := 0; i < num; i++ {
        x := r.Intn(l)
        buf.WriteString(s[x : x+1])
    }

    return buf.String()
}

func getRandSeek() int64 {
    l.Lock()
    if randSeek >= 100000000 {
        randSeek = 1
    }
    randSeek++
    l.Unlock()
    return time.Now().UnixNano() + randSeek

}

加一个计数,这是使用时间作为种子的简单改进型,在同一线程多次调用及并发的时候都表现良好。

时间: 2024-10-19 04:43:33

golang 生成随机数,时间种子改进型的相关文章

生成随机数的种子

如下面一段python代码 1 import random 2 3 random.seed(10) 4 a = random.random() 5 print('a=', a) 6 7 b = random.random() 8 print('b=', b) 9 10 random.seed(10) 11 c = random.random() 12 print('c=', c) 13 14 random.seed(9) 15 d = random.random() 16 print('d=',

Golang 生成随机数

package main import ( "fmt" "math/rand" "time" ) func main() { rand.Seed(time.Now().UnixNano()) for i := 0; i < 10; i++ { x := rand.Intn(100) fmt.Println(x) } }

java生成随机数的两种方式

[方法一] 调用 util 中的 Random 类:定义Random的对象 rand,用 rand.nextInt()生成随机整数 或者将 next 后面的Int改为 Double,Float ,  Long,分别对应了双精度,单精度和长整形) 注意只有 nextInt( ) 可以带参数,例如: rand.nextInt(10) 则随机生成0到9的随机数: import java.util.Random; public class Test{ public static void main(St

PHP——生成随机数和日期时间

在PHP里面两个常用的函数 rand();    生成随机数   当括号内无参数时 系统会以当前时间为种子进行随机数的生成 rand(1,10);  括号里面是生成随机数的范围,在形成的随机数在1~10之间,在PHP里面要么不写参数,要么写两个参数形成一个有效的取值范围,不能只写一个参数或者写两个无效的参数. time();    时间日期函数,在这里如果只输出time();的话在页面中显示出来的只是一段数字,这段数字代表的是一个时间戳,那么我们需要显示出来的是时间而不是时间戳,就需要进行转化,

PHP的函数-----生成随机数、日期时间函数

常用的函数 [1]   生成随机数 rand(); 例子: echo rand(); 显示结果: 当刷新时,会有不同的数,默认生成随机数.生成随机数不能控制范围. 如果,想要控制在范围之内,就用: echo rand(最小值,最大值); //两个参数来确定随机数的范围 例子: 生成的随机数控制在1到10之间? echo rand(1,10); 显示结果: 生成随机的数就是1到10之间,不可能出现10以外的数. 如果只写一个参数: 例子: echo rand(9); 显示结果: rand()方法,

生成唯一的随机数(时间+随机数)

package com.st.utils; import java.util.Random; /** *@Author Mr.Li *@Date 2018/3/10 23:42 *@Description 生成唯一的主键 随机数 * 格式 : 时间+随机数 * synchronized 为保证多线程时不重复 */ public class KeyUtil { public static synchronized String genUniqueKey(){ Random random = new

&lt;转&gt; c/c++生成随机数

<一> C/C++怎样产生随机数:这里要用到的是rand()函数, srand()函数,C语言/C++里没有自带的random(int number)函数. (1)  如果你只要产生随机数而不需要设定范围的话,你只要用rand()就可以了:rand()会返回一随机数值, 范围在0至RAND_MAX 间.RAND_MAX定义在stdlib.h, 其值为2147483647. 例如: #include<stdio.h> #include<stdlib.h> void mai

【C#】Random类中构造方法、时间种子与随机数序列的关系

Random类 构造函数 1) Random random = new Random(); // 无参数构造函数使用系统时钟生成其种子值 然而,系统时钟取值范围有限,因此在小规模计算中,可能无法使用不同的种子值分别调用此构造函数, 这将导致两个random对象生成相同的随机数字序列. 1 using System; 2 using System.Collections.Generic; 3 4 namespace FirstTest 5 { 6 class Program 7 { 8 stati

loadrunner生成随机数

loadrunner生成随机数 对网站注册进行压力测试时,需要对注册的用户名进行参数化,因为可以会用到大量的测试数据,所以选择通过生成随机数来进行参数化.最开始用loadrunner自带的参数随机功能,代码如下: "Name=RegForm[name]", "Value={NewParam}", ENDITEM, 参数化选择为:random number 因系统对用户名的位数做了限制,同时为了方便统计,将代码修改为: "Name=RegForm[name]