gpt4 book ai didi

c++ - 未初始化的局部变量是最快的随机数生成器吗?

转载 作者:bug小助手 更新时间:2023-10-28 01:31:45 25 4
gpt4 key购买 nike

我知道未初始化的局部变量是未定义的行为(UB),并且该值可能具有可能影响进一步操作的陷阱表示,但有时我只想将随机数用于视觉表示并且不会在程序的其他部分进一步使用它们,例如在视觉效果中设置一些随机颜色的东西,例如:

void updateEffect(){
for(int i=0;i<1000;i++){
int r;
int g;
int b;
star[i].setColor(r%255,g%255,b%255);
bool isVisible;
star[i].setVisible(isVisible);
}
}

有那么快吗

void updateEffect(){
for(int i=0;i<1000;i++){
star[i].setColor(rand()%255,rand()%255,rand()%255);
star[i].setVisible(rand()%2==0?true:false);
}
}

而且还比其他随机数生成器更快?

最佳答案

正如其他人所指出的,这是未定义行为 (UB)。

在实践中,它(可能)实际上(某种)会起作用。从 x86[-64] 架构上的未初始化寄存器读取确实会产生垃圾结果,并且可能不会做任何坏事(与例如 Itanium 相反,其中 registers can be flagged as invalid ,因此读取会传播像 NaN 这样的错误)。

但有两个主要问题:

  1. 它不会特别随机。在这种情况下,您正在从堆栈中读取,因此您将获得之前存在的任何内容。这可能是有效随机的、完全结构化的、您十分钟前输入的密码或您祖母的 cookies 配方。

  2. 不好的做法(大写“B”) 让此类内容潜入您的代码中。从技术上讲,编译器可以在每次读取 undefined variable 时插入 reformat_hdd();。它不会,但无论如何你都不应该这样做。不要做不安全的事情。你犯的异常(exception)越少,你就越能避免意外错误一直

UB 更紧迫的问题是它使您的整个程序的行为未定义。现代编译器可以使用它来省略大量代码甚至go back in time .玩 UB 就像一个维多利亚时代的工程师拆除一个活核 react 堆。有无数的事情会出错,而且你可能不知道一半的基本原理或实现的技术。 可能没问题,但你仍然不应该让它发生。有关详细信息,请查看其他不错的答案。

另外,我会解雇你。

关于c++ - 未初始化的局部变量是最快的随机数生成器吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31739792/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com