Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

math/rand: possibly ambiguous use of operator "^" in documentation #35920

Closed
admacro opened this issue Dec 1, 2019 · 8 comments
Assignees

Comments

@admacro
Copy link

@admacro admacro commented Dec 1, 2019

According to the doc here https://golang.org/pkg/math/rand/#Seed

Seed values that have the same remainder when divided by 2^31-1 generate the same pseudo-random sequence.

This means seed 29 and 57 will generate the same pseudo random sequence. But I get different results. Am I missing something?

What version of Go are you using (go version)?

$ go version
go version go1.13.4 darwin/amd64

Does this issue reproduce with the latest release?

Yes

What operating system and processor architecture are you using (go env)?

go env Output
$ go env
GO111MODULE=""
GOARCH="amd64"
GOBIN=""
GOCACHE="/Users/james/Library/Caches/go-build"
GOENV="/Users/james/Library/Application Support/go/env"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="darwin"
GONOPROXY=""
GONOSUMDB=""
GOOS="darwin"
GOPATH="/Users/james/go"
GOPRIVATE=""
GOPROXY="https://proxy.golang.org,direct"
GOROOT="/usr/local/go"
GOSUMDB="sum.golang.org"
GOTMPDIR=""
GOTOOLDIR="/usr/local/go/pkg/tool/darwin_amd64"
GCCGO="gccgo"
AR="ar"
CC="clang"
CXX="clang++"
CGO_ENABLED="1"
GOMOD=""
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=/var/folders/sp/n3hrxcgd3wgb8zb_3mt1w9kr0000gn/T/go-build316781643=/tmp/go-build -gno-record-gcc-switches -fno-common"

What did you do?

https://play.golang.org/p/AoWrOyO2rOP

What did you expect to see?

same pseudo random sequence

What did you see instead?

different results with seed 29 and 57
29: 3
57: 4

@tmthrgd

This comment has been minimized.

Copy link
Contributor

@tmthrgd tmthrgd commented Dec 1, 2019

2^31-1 is two raised to the thirty-first power minus one, not two xor thirty-one minus one. That has a value of 2147483647 and not 28 as you have in the playground link. So both 29 and 57 have different remainders.

@ALTree

This comment has been minimized.

Copy link
Member

@ALTree ALTree commented Dec 1, 2019

What @tmthrgd said. The doc says that all numbers of form 2147483647·n + k (with fixed k) will generate the same sequence.

Closing here, since this is working as intended.

@ALTree ALTree closed this Dec 1, 2019
@admacro

This comment has been minimized.

Copy link
Author

@admacro admacro commented Dec 2, 2019

Hi @tmthrgd, and @ALTree Ok, and thank you for pointing this out. I actually had thought of the possibility of ^ being power operator rather than xor, but didn't give it a try out of laziness =_=. Do you think it worthy to eliminate possible future confusion on the notion of ^ by updating the expression 2^31-1 to an unambiguous form in the doc, for example 2147483647 (2^31-1) or simply 2147483647? Or there is a general agreement on "the notion of ^ in the doc" somewhere that I missed?

@ALTree

This comment has been minimized.

Copy link
Member

@ALTree ALTree commented Dec 2, 2019

Or there is a general agreement on "the notion of ^ in the doc" somewhere that I missed?

I guess it depends on the context. I admit it can be confusing, since in Go ^ is the bitwise xor, but on the other hand I think that in an expression like 2^31-1 it feels natural to read the 31 as an exponent so in practise most readers won't be confused.

We could make this completely unambiguous, maybe using proper unicode superscripts. There is some precedent:

ProbablyPrime is 100% accurate for inputs less than 2⁶⁴

  • The Sqrt doc says:

the largest integer such that z² ≤ x

So we already use unicode superscripts in some places in the documentation. We could change the rand doc to

Seed values that have the same remainder when divided by 2³¹-1

That would prevent any confusion.

Re-opening as a doc issue.

@ALTree ALTree reopened this Dec 2, 2019
@ALTree ALTree added the Documentation label Dec 2, 2019
@ALTree ALTree changed the title math/rand: Seed values that have the same remainder when divided by 2^31-1 does not generate same pseudo-random sequence math/rand: possibly ambiguous use of operator "^" in documentation Dec 2, 2019
@ALTree ALTree added the NeedsFix label Dec 2, 2019
@admacro

This comment has been minimized.

Copy link
Author

@admacro admacro commented Dec 2, 2019

Ah yes, unicode superscript, like in math, perfect! Haven't thought of that. :-D

@ALTree ALTree self-assigned this Dec 2, 2019
@go101

This comment has been minimized.

Copy link

@go101 go101 commented Dec 2, 2019

Maybe 1<<32 - 1 is not also bad.

@rsc

This comment has been minimized.

Copy link
Contributor

@rsc rsc commented Dec 2, 2019

Please use the Unicode superscript like in all our other docs, not <<. Thanks.

@gopherbot

This comment has been minimized.

Copy link

@gopherbot gopherbot commented Dec 4, 2019

Change https://golang.org/cl/209758 mentions this issue: math/rand: update comment to avoid use of ^ for exponentiation

@gopherbot gopherbot closed this in 7d1d944 Dec 4, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
6 participants
You can’t perform that action at this time.