Hi Jiefei,

I don't believe there's an issue with the RNG (Random Number Generator).

The unexpected result you're seeing is due to providing a float number to the 
rnorm() function, which expects an integer. When you input a float, R coerces 
it to an integer using as.integer(). This function truncates the decimal part 
rather than rounding.

Here's an example to illustrate:

nList <- seq(0, 1, 0.2)

 n <- nList[4] 

n

 [1] 0.6

1000 - 1000 * n 

[1] 400

as.integer(1000 - 1000 * n) 

[1] 399

As you can see, it is truncated to 399.





Regards,


Xianying Tan (shrektan)




---- Replied Message ----
| From | Jiefei Wang<szwj...@gmail.com> |
| Date | 08/17/2024 12:11 |
| To | Rui Barradas<ruipbarra...@sapo.pt> |
| Cc | r-devel<R-devel@r-project.org> |
| Subject | Re: [Rd] Strange Behavior in RNG |
Hi Rui and John,

Thanks for your reply. I'm not sure if this is a question for R-help as I
think the behavior of RNG is weird, but I will happy to move this
discussion if the admin think this is not their topic.

I was a C/C++ developer so I understand the double-type numbers sometimes
can generate surprising results, but what unexpected here is that even the
number is super close to 400 'rnorm' still rounds it down to 399. Shouldn't
it be round up in this case? Probably the underlying code just convert the
number into an int type, but I was expecting that the function can tolerate
a certain degree of errors. Maybe I have too much expectations for it...

Best,
Jiefei



On Fri, Aug 16, 2024, 22:19 Rui Barradas <ruipbarra...@sapo.pt> wrote:

Às 01:45 de 17/08/2024, Jiefei Wang escreveu:
Hi,

I just observed a strange behavior in R. The rnorm function does not
give me the numbers with a given length. I think it is somehow related
to the internal representation of double-type numbers but I am not
sure if this is supposed to happen. Below is a reproducible example

```
## Create a list, we will only take the forth value, which is 0.6
nList <- seq(0,1,0.2)
n <- nList[4]
n
# [1] 0.6
length(rnorm(1000*n))
# [1] 600
length(rnorm(1000-1000*n))
# [1] 399 <--- What happened here?
length(rnorm(1000-1000*0.6))
# [1] 400
1000-1000*n
# [1] 400 <- this looks good to me...
1000-1000*0.6
# [1] 400
identical(n, 0.6)
# [1] FALSE
.Internal(inspect(n))
# @0x00000217c75d79d0 14 REALSXP g0c1 [REF(1)] (len=1, tl=0) 0.6
.Internal(inspect(0.6))
# @0x00000217c791e0c8 14 REALSXP g0c1 [REF(2)] (len=1, tl=0) 0.6
```

As you can see, length(rnorm(1000-1000*n)) does not really give me the
result I want. This is somewhat surprising because it is hard to
imagine that a manually-typed 0.6 can behave differently than 0.6 from
a sequence. Furthermore, 0.6 is the only problematic number from
`nList`. The rest numbers work fine. I can guess it is due to the
rounding mechanism, but I think this should be treated as a bug: if
the print function can show the result of 1000-1000*n correctly, it
will be strange that rnorm behaves differently. Below is my session
info

R version 4.3.0 (2023-04-21 ucrt)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 10 x64 (build 19045)

Matrix products: default

locale:
[1] LC_COLLATE=English_United States.utf8
[2] LC_CTYPE=English_United States.utf8
[3] LC_MONETARY=English_United States.utf8
[4] LC_NUMERIC=C
[5] LC_TIME=English_United States.utf8

time zone: America/Chicago
tzcode source: internal

______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel
Hello,

This is R FAQ 7.31.
In fact, the sequences

seq(0, 1, 0.1)
seq(0, 1, 0.2)

should probably be a FAQ 7.31 example.
If you print the numbers with more decimals you will see why the error.



# generate the list
nList <- seq(0,1,0.2)
# compare the list with manually typed numbers
nList != c(0, 0.2, 0.4, 0.6, 0.8, 1)
#> [1] FALSE FALSE FALSE  TRUE FALSE FALSE

# note the value of 0.6
print(nList, digits = 16L)
#> [1] 0.0000000000000000 0.2000000000000000 0.4000000000000000
0.6000000000000001
#> [5] 0.8000000000000000 1.0000000000000000


Hope this helps,

Rui Barradas



--
Este e-mail foi analisado pelo software antivírus AVG para verificar a
presença de vírus.
www.avg.com


[[alternative HTML version deleted]]

______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel

        [[alternative HTML version deleted]]

______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel

Reply via email to