英文:
Generating random numbers in Julia
问题
在Julia中如何生成范围在[-1, 1]之间的真正随机数?
抱歉,我刚开始在Julia中工作,但找不到正确的答案。例如,我尝试了以下代码:
rand(Float16, [-1,1], 1)
但每次都会出现ERROR: MethodError
。
英文:
How to generate a real random number in range [-1, 1] in Julia?
Sorry, I'm just starting working in Julia and I couldn't find a right answer. For example I tried
rand(Float16, [-1,1], 1)
but I get ERROR: MethodError
every time.
答案1
得分: 3
rand()
返回一个 [0, 1)
范围内的随机数,所以你可以做的最简单的事情是
2rand() - 1
当你向 rand(x)
提供一个参数时,通常意味着类似 "从 x
中返回一个随机样本"。例如,rand(1:10)
意味着 "随机选择一个介于1和10(包括1和10)之间的整数:
julia> rand(1:10)
2
rand
的第二个位置参数是样本数,所以 rand(1:10, 3)
会随机选择3个数字(可以有重复):
julia> rand(1:10, 3)
3个整数向量:
6
5
10
如果你想更明确地说明你要抽样的分布,可以使用 Distributions
包:
julia> using Distributions
julia> rand(Uniform(-1, 1), 3)
3个Float64向量:
0.13509110532903756
-0.026048031817401895
-0.5490076326320161
在这里,我们将一个 Distribution
对象作为第一个参数传递,这意味着 rand
将根据 Distributions
中定义的概率密度函数从该分布中抽样。
关于浮点数运算的限制,我们可以继续讨论很长时间。Julia社区有一些关于这个话题的深入讨论,这是我随机找到的一个讨论(非恶意随机):
英文:
rand()
returns a random number in [0, 1)
, so the easiest thing you could do is
2rand() - 1
When you give an argument to rand(x)
it generally means something like "return a random sample from x
. As an example, rand(1:10)
means "pick an integer between 1 and 10 (inclusive) at random:
julia> rand(1:10)
2
The second positional argument to rand
is the number of samples, so rand(1:10, 3)
will pick 3 random numbers (with replacement):
julia> rand(1:10, 3)
3-element Vector{Int64}:
6
5
10
If you wanted to be more explicit about the distribution you're sampling from you could use the Distributions
package:
julia> using Distributions
julia> rand(Uniform(-1, 1), 3)
3-element Vector{Float64}:
0.13509110532903756
-0.026048031817401895
-0.5490076326320161
Here we pass a Distribution
object as the first argument, which means rand
will sample from this distribution according to the pdf defined in Distributions
.
We could go on for quite a bit longer as your question turns out to be quite a deep one when one considers the limitations of floating point arithmetic. The Julia community being the Julia community there are some lengthy discussions on Discourse about this topic, here's one I found at random (no pun intended):
答案2
得分: 1
如果你想创建Float16
类型的随机值,至少有以下两种选项:
julia> 2 * rand(Float16) - 1
Float16(-0.952)
或者使用Distributions.jl
:
julia> d = Uniform{Float16}(-1, 1);
julia> rand(d)
0.3907014142060643
julia> rand(d) |> typeof
Float64
英文:
If you want to create random values of type Float16
you have at least these two options:
julia> 2*rand(Float16) - 1
Float16(-0.952)
Or using Distributions.jl
julia> d = Uniform{Float16}(-1, 1);
julia> rand(d)
0.3907014142060643
julia> rand(d) |> typeof
Float64
答案3
得分: 0
生成例如在-1和1之间的10个随机数,使用广播
julia> rand(10) .* rand((-1,1), 10)
10个Float64类型的元素:
0.7832605719765726
0.11799399505997143
0.49379156313102823
-0.4481589093858642
-0.9394405800834137
0.12834147407759333
-0.9643503751879805
-0.6624220140320877
0.4220815095109952
0.16949781166834121
英文:
Generating e.g. 10 random numbers between -1 and 1, using broadcasting
julia> rand(10) .* rand((-1,1), 10)
10-element Vector{Float64}:
0.7832605719765726
0.11799399505997143
0.49379156313102823
-0.4481589093858642
-0.9394405800834137
0.12834147407759333
-0.9643503751879805
-0.6624220140320877
0.4220815095109952
0.16949781166834121
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论