GVKun编程网logo

numpy.random.randn () 和 numpy.random.rand ()

4

以上就是给各位分享numpy.random.randn()和numpy.random.rand(),同时本文还将给你拓展c–我应该使用“rand%N”还是“rand()/(RAND_MAX/N1)”?

以上就是给各位分享numpy.random.randn () 和 numpy.random.rand (),同时本文还将给你拓展c – 我应该使用“rand%N”还是“rand()/(RAND_MAX / N 1)”?、Golang: math/rand 和 crypto/rand 区别、Java Random Random in interval [-1000,1000]、linux – “cat / dev / random”与“tail -f / dev / random”等相关知识,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

numpy.random.randn () 和 numpy.random.rand ()

numpy.random.randn () 和 numpy.random.rand ()

1 numpy.random.rand()

  (1)numpy.random.rand(d0,d1,…,dn)

    rand 函数根据给定维度生成 [0,1) 之间的数据,包含 0,不包含 1

    dn 表格每个维度

    返回值为指定维度的 array

  (2)

print(np.random.rand(2,4))
生成一个2行4列的0到1之间的数组

[[0.16965512 0.97445517 0.51992353 0.73377611]
[0.91446815 0.65995296 0.67720307 0.34809015]]

print(np.random.rand(4,3,2))

[[[0.10401912 0.82232074]
[0.68653479 0.07301172]
[0.59939558 0.58055146]]
[[0.03088151 0.88140311]
[0.4033945 0.47251058]
[0.2284928 0.70175964]]
[[0.44053464 0.20180619]
[0.15514924 0.90906066]
[0.17861751 0.68839029]]
[[0.31387288 0.90869563]
[0.14992 0.60987398]
[0.63666834 0.73750431]]]



 

2 numpy.random.randn()

numpy.random.randn(d0,d1,…,dn)

  • randn 函数返回一个或一组样本,具有标准正态分布。
  • dn 表格每个维度
  • 返回值为指定维度的 array
print(np.random.randn(2,4))

[[-3.76215048e-04 8.66687229e-01 -2.38559669e-01 1.75060171e+00]
[ 1.57466855e+00 8.17036401e-01 -1.05382851e+00 -1.72285071e+00]]

 

c – 我应该使用“rand%N”还是“rand()/(RAND_MAX / N 1)”?

c – 我应该使用“rand%N”还是“rand()/(RAND_MAX / N 1)”?

我正在阅读 C FAQ并在 question中发现它建议我使用rand()/(RAND_MAX / N 1)而不是更流行的方式是rand()%N.

原因是当N是一个低数字rand()%N将只使用rand()中的几个位.

我在Windows和Linux上测试了N为2的不同方法但是没有注意到差异.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 2

int main(void)
{
    srand(0);
    printf("rand() %% N:\n");
    for (int i = 0; i < 40; ++i) {
        printf("%d ",rand() % N);
    }
    putchar('\n');

    srand(0);
    printf("rand() / (RAND_MAX / N + 1):\n");
    for (int i = 0; i < 40; ++i) {
        printf("%d ",rand() / (RAND_MAX / N + 1));
    }
    putchar('\n');

    return 0;
}

输出是这个(在我的gnu / linux机器上):

rand() % N:
1 0 1 1 1 1 0 0 1 1 0 1 0 1 1 0 0 0 0 0 1 0 1 1 0 0 0 1 1 1 1 0 0 0 1 1 1 0 1 0 
rand() / (RAND_MAX / N + 1):
1 0 1 1 1 0 0 1 0 1 0 1 0 1 1 1 1 1 0 1 0 0 0 1 0 0 0 0 1 0 1 1 1 0 1 1 0 1 0 1

两种选择对我来说都是完全随机的.甚至看起来第二种方法比兰特%N更差.

我应该使用rand()%N还是rand()/(RAND_MAX / N 1)?

解决方法

如果N是2的幂,则使用余数技术通常是安全的(RAND_MAX通常是2的幂-1,因此整个范围具有两个长度的幂).更一般地,N必须除以rand()的范围以避免偏差.

否则,无论rand()的质量如何,都会遇到this problem.简而言之,问题在于你将该范围切割成长度为N的多个“部分”,如果N不分割范围则最后部分将不完整.因此,从该部分“切断”的数字不太可能发生,因为它们可以从中生成更少的“部分”.

不幸的是rand()/(RAND_MAX / N 1)也被破坏了(几乎以同样的方式),所以真正的答案是:不要使用它们中的任何一个.

上面提到的问题非常重要,除非Y除以X,否则无法在Y结果上均匀分布X个不同的值.您可以通过拒绝一部分随机样本来修复它,使Y除以新的X.

Golang: math/rand 和 crypto/rand 区别

Golang: math/rand 和 crypto/rand 区别

1. 前言

原文地址

之前发现了golang标准库中又两个rand软件包,开始非常想知道他们之间的差异.

math/rand软件包可以用于简单的游戏,但不能用于真正的随机性。

  • math/rand: 伪随机数生成器
  • crypto/rand: 加密安全的随机数生成器

Rob Pike的代码

package main

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

func main() {
    c := fanIn(boring("Joe"), boring("Ann"))
    for i := 0; i < 10; i++ {
        fmt.Println(<-c)
    }
    fmt.Println("You''re both boring; I''m leaving.")
}

func boring(msg string) <-chan string {
    c := make(chan string)
    go func() {
        for i := 0; ; i++ {
            c <- fmt.Sprintf("%s %d", msg, i)
            time.Sleep(time.Duration(rand.Intn(1e3)) * time.Millisecond)
        }
    }()
    return c
}

// FAN IN
func fanIn(input1, input2 <-chan string) <-chan string {
    c := make(chan string)
    go func() {
        for {
            c <- <-input1
        }
    }()
    go func() {
        for {
            c <- <-input2
        }
    }()
    return c
}

2. Math/rand 伪随机数生成器

实现伪随机数生成器。

随机数由源生成。顶级函数(例如Float64和Int)使用默认的共享源,该源在每次运行程序时都会产生确定的值序列。 如果每次运行需要不同的行为, 请使用种子函数初始化默认的源。 默认的Source可安全地供多个goroutine并发使用,但不是由NewSource创建的Source。

package main

import (
    "fmt"
    "math/rand"
    "time"
)
func init(){
    rand.Seed(time.Now().UTC().UnixNano())
}

func main() {

    // launches 2 generators and the fanIn collector function
    c := fanIn(genrt(), genrt())
    for i := 0; i < 10000; i++ {
        fmt.Println(<-c)
    }
}

func fanIn(a <-chan int, b <-chan int) <-chan string {
    c := make(chan string)
    // launch collector from a to channel
    go func() {
        var count int
        for {
            count += <-a
            c <- fmt.Sprintf("Tally of A is: %d", count)
        }
    }()
    // launch collector from b to channel
    go func() {
        var count int
        for {
            count += <-b
            c <- fmt.Sprintf("Tally of B is: %d", count)
        }
    }()

    return c
}

func genrt() <-chan int {
    c := make(chan int)
    // launch generator of Dice rolls
    go func() {
        for i := 0; ; i++ {
            c <- rand.Intn(6) + 1
            time.Sleep(time.Duration(500 * time.Millisecond))
        }
    }()
    return c
}


打印输出

...
Tally of B is: 17656
Tally of A is: 17438
Tally of A is: 17440
Tally of B is: 17659
Tally of B is: 17660
Tally of A is: 17445

3. Crypto/rand 加密安全的随机数生成器

实现了加密安全的随机数生成器。

package main
import (
    "crypto/rand"
    "fmt"
    "math/big"
    "time"
)

func main() {

    // launches 2 generatores and the fanIn collector function
    c := fanIn(genrt(), genrt())
    for i := 0; i < 10000; i++ {
        fmt.Println(<-c)
    }
}

func fanIn(a <-chan int, b <-chan int) <-chan string {
    c := make(chan string)
    // launch collector from a to channel
    go func() {
        var count int
        for {
            count += <-a
            c <- fmt.Sprintf("Tally of A is: %d", count)
        }
    }()
    // launch collector from b to channel
    go func() {
        var count int
        for {
            count += <-b
            c <- fmt.Sprintf("Tally of B is: %d", count)
        }
    }()

    return c
}

func genrt() <-chan int {
    c := make(chan int)
    // launch generator of Dice rolls
    go func() {
        for i := 0; ; i++ {
            dice, err := rand.Int(rand.Reader, big.NewInt(6))
            if err != nil {
                fmt.Println(err)
            }
            c <- int(dice.Int64()) + 1
            time.Sleep(time.Duration(1 * time.Millisecond))
        }
    }()
    return c
}

打印输出

...
Tally of B is: 17496
Tally of A is: 17570
Tally of A is: 17574
Tally of B is: 17500
Tally of B is: 17505
Tally of A is: 17576

Java Random Random in interval [-1000,1000]

Java Random Random in interval [-1000,1000]

在 java我有:

Random random = new Random();
double randomNum = random.nextDouble();

这会创建一个介于0和1之间的随机数.但是我想要一个介于-1000和1000之间的数字,我该如何缩放呢?

谢谢

解决方法

2种可能性:

> [密度较小]:将结果乘以2000,然后减去1000
从结果.它不会像可能性2那样“密集”.
>在范围[-1000,999]中获取随机int,并添加一个随机双精度
范围[0,1].

请注意,可能性2确保了更好的随机性和更好的“密度”,以2次随机调用为代价[如果这是一个问题,这可能是扩展性的].

linux – “cat / dev / random”与“tail -f / dev / random”

linux – “cat / dev / random”与“tail -f / dev / random”

声明

cat /dev/random

按预期继续产出产量,但是

tail -f /dev/random

挂起(至少在OSX和SUSE上).
为什么后一种说法会挂起?

最佳答案
tail -f做了几件事:

>查找流的结尾,通过读取直到达到EOF或通过搜索结束(/ dev / random上没有的操作).
>备份一定长度(可能通过保留最近读取的适当长度内容的缓冲区,可能通​​过在初始扫描期间保留最后N行的搜索位置列表,或通过其他方式),并打印内容在那一点和结束之间.
>继续打印新内容,因为此类内容可用.

如果没有结束 – 就像/ dev / random那样 – 第一步永远不会完成.

cat不需要找到一个从它那里寻找回头的结局,所以它没有相关的失败点.

关于numpy.random.randn () 和 numpy.random.rand ()的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于c – 我应该使用“rand%N”还是“rand()/(RAND_MAX / N 1)”?、Golang: math/rand 和 crypto/rand 区别、Java Random Random in interval [-1000,1000]、linux – “cat / dev / random”与“tail -f / dev / random”的相关信息,请在本站寻找。

本文标签: