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
Closed

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

admacro opened this issue Dec 1, 2019 · 8 comments
Labels
Documentation FrozenDueToAge NeedsFix The path to resolution is known, but the work has not been done.

Comments

@admacro
Copy link

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
Copy link
Contributor

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
Copy link
Member

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 as completed Dec 1, 2019
@admacro
Copy link
Author

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
Copy link
Member

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 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 The path to resolution is known, but the work has not been done. label Dec 2, 2019
@admacro
Copy link
Author

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
Copy link

go101 commented Dec 2, 2019

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

@rsc
Copy link
Contributor

rsc commented Dec 2, 2019

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

@gopherbot
Copy link

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

@golang golang locked and limited conversation to collaborators Dec 3, 2020
@rsc rsc unassigned ALTree Jun 23, 2022
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
Documentation FrozenDueToAge NeedsFix The path to resolution is known, but the work has not been done.
Projects
None yet
Development

No branches or pull requests

6 participants