Golang中rand.Seed()的操作

记录一下用mac地址+local时间作为seed来产生随机数

package main

import (
    "fmt"
    "math/rand"
    "encoding/binary"
    "time"
    "net"
    "reflect"
    "crypto/md5"
    "encoding/hex"
    "strconv"

)

func getMacAddrs() (macAddrs []string) {
    netInterfaces, err := net.Interfaces()
    if err != nil {
        fmt.Printf("fail to get net interfaces: %v", err)
        return macAddrs
    }

    for _, netInterface := range netInterfaces {
        macAddr := netInterface.HardwareAddr.String()
        if len(macAddr) == 0 {
            continue
        }

        macAddrs = append(macAddrs, macAddr)
    }
    return macAddrs
}

func GetMD5Hash(text string) string {
    hasher := md5.New()
    hasher.Write([]byte(text))
    return hex.EncodeToString(hasher.Sum(nil))
}

func main(){

    // mac address
    mac_adr := getMacAddrs()
    fmt.Printf("mac addrs: %q\n", mac_adr)  //[]string
    hs_mac := GetMD5Hash(mac_adr[0])
    fmt.Printf("hs_mac:%s\n",hs_mac) // string
    fmt.Println("hs_mac_type:",reflect.TypeOf(hs_mac))

    // 取前16位转换成int64
    newmac, err := strconv.ParseInt(hs_mac[:16], 16, 64)
    if err != nil {
        panic(err)
        fmt.Println("errr")
    }
    fmt.Printf("Hello, %v with type %s!\n", newmac, reflect.TypeOf(newmac))

    i := 0
    for i < 3{
        // time (int64)
        t := time.Now().UnixNano() // int64
        fmt.Println("t:",t)
        fmt.Println("t_type:",reflect.TypeOf(t))
        var seed int64
        seed += t
        seed += newmac
        fmt.Println("seed:",seed)
        rnd := make([]byte,4)

        // //UnixNano返回的是int64
        //rand.Seed(time.Now().UnixNano())
        rand.Seed(seed)
        // //fand.Uint32()实现返回一个0-2^32范围内的伪随机数.
        binary.LittleEndian.PutUint32(rnd, rand.Uint32())
        fmt.Println("\nrnd:",rnd,"type:",reflect.TypeOf(rnd)) 

        i++
    }
}

输出

mac addrs: ["d8:9e:f3:95:25:eb" "fc:01:7c:9e:4c:61"]
hs_mac:4365a5df737a58c3d9ac998937dd4f8f
hs_mac_type: string
Hello, 4856470152322635971 with type int64!
t: 1545388101345983327
t_type: int64
seed: 6401858253668619298

rnd: [255 141 16 39] type: []uint8
t: 1545388101345999732
t_type: int64
seed: 6401858253668635703

rnd: [245 72 11 47] type: []uint8
t: 1545388101346013785
t_type: int64
seed: 6401858253668649756

rnd: [142 160 77 138] type: []uint8

原文地址:https://www.cnblogs.com/kumata/p/10157409.html

时间: 2024-11-10 15:16:12

Golang中rand.Seed()的操作的相关文章

Golang中的字节序列化操作

在写网络程序的时候,我们经常需要将结构体或者整数等数据类型序列化成二进制的buffer串.或者从一个buffer中解析出来一个结构体出来,最典型的就是在协议的header部分表征head length 或者body length在拼包和拆包的过程中,需要按照规定的整数类型进行解析,且涉及到大小端序的问题. 1.C中是怎么操作的 在C中我们最简单的方法是用memcpy来一个整形数或者结构体等其他类型复制到一块内存中,然后在强转回需要的类型.如:     // produce     int a =

Golang 中操作 Mongo Update 的方法

Golang 和 MongoDB 中的 ISODate 时间交互问题 2018年02月27日 11:28:43 独一无二的小个性 阅读数:357 标签: GolangMongoDB时间交互时间转换 更多 个人分类: MongoDBGolang 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u010649766/article/details/79385948 MongoDB 中有一种时间格式数据 ISODate,参考如下:  如果在 Golan

Go中使用seed得到相同随机数的问题

1. 重复的随机数 废话不多说,首先我们来看使用seed的一个很神奇的现象. func main() { for i := 0; i < 5; i++ { rand.Seed(time.Now().Unix()) fmt.Println(rand.Intn(100)) } } // 结果如下 // 90 // 90 // 90 // 90 // 90 可能不熟悉seed用法的看到这里会很疑惑,我不是都用了seed吗?为何我随机出来的数字都是一样的?不应该每次都不一样吗? 可能会有人说是你数据的样

Golang中多用途的defer

defer顾名思义就是延迟执行,那么defer在Golang中该如何使用以及何时使用呢? A "defer" statement invokes a function whose executionis deferred to the moment the surrounding function returns, Golang的官方时这么定义的. 1.那么在什么情况下会调用defer延迟过的函数呢? 从文档中可以知道主要有两种情况: 当函数执行了return 语句后 当函数处于pan

C++中rand()函数的用法

C++中rand()函数的用法   2011-12-30 11:03:59|  分类: C / C++|举报|字号 订阅 一.C++中不能使用random()函数 random函数不是ANSI C标准,不能在gcc,vc等编译器下编译通过.但在C语言中int random(num)可以这样使用,它返回的是0至num-1的一个随机数. 可改用C++下的rand函数来实现. 1.C++标准函数库提供一随机数生成器rand,返回0-RAND_MAX之间均匀分布的伪随机整数. RAND_MAX必须至少为

golang中使用selenium进行爬虫

selenium本来是用来做自动测试,但是因为可以模拟浏览器操作,所以也可以用来做爬虫(尤其是一些比较变态登陆网站,又不会模拟登陆的),只是速度会比较慢. 转载请注明出处:http://www.cnblogs.com/SSSR/p/6390229.html 经验总结: 1.火狐浏览器在运行较长时间后,会导致内存泄露,但是Google浏览器不会,所以如果长时间运行还是使用Google浏览器比较好. 2.截图方面选择火狐浏览器,Google浏览器无法截全部页面,即使设置了页面大小也不行. 3.Fir

Golang中使用log(二):Golang 标准库log的实现

前一篇文章我们看到了Golang标准库中log模块的使用,那么它是如何实现的呢?下面我从log.Logger开始逐步分析其实现. 其源码可以参考官方地址 1.Logger结构 首先来看下类型Logger的定义: type Logger struct { mu sync.Mutex // ensures atomic writes; protects the following fields prefix string // prefix to write at beginning of each

Golang 中使用多维 map

http://tnt.wicast.tk/2015/11/02/golang-multiple-dimension-map/ Golang 的 XML/JSON 解析库乍看使用起来很方便,只要构造一样结构的 Struct 就可以一下子导入到变量中去了.其实手工构造 Struct 非常容易出现结构偏差,而且最要命的是 Unmarshal() 执行的时候不是严格导入所以没有任何报错. 于是这两天写了一个给 Golang 用的 XML to Struct 生成器,希望能一劳永逸. 不过在制作过程中有遇

Golang 中的指针 - Pointer

Go 的原生数据类型可以分为基本类型和高级类型,基本类型主要包含 string, bool, int 及 float 系列,高级类型包含 struct,array/slice,map,chan, func . 相比 Java,Python,Javascript 等引用类型的语言,Golang 拥有类似C语言的指针这个相对古老的特性.但不同于 C 语言,Golang 的指针是单独的类型,而不是 C 语言中的 int 类型,而且也不能对指针做整数运算.从这一点看,Golang 的指针基本就是一种引用