rand() 从哪里得到它的数字?
Where does rand() get its numbers from?
在做一个小项目时,我想我可以用像这样的一点代码生成 "random" 文件名,
std::cout << "image"+rand()%255 << std::endl;
我得到的输出对我来说毫无意义。它们似乎是错误消息的随机部分。
比如这段代码:
int main()
{
while(1){
std::cout << "image" + rand() % 255 << std::endl;
}
return 0;
}
产生如下乱码:
> ge
>
> n
>
>
> i
>
>
> ring too long
>
> U
>
>
>
>
>
> &
>
> n
> _
> o
> string position
> e
> lid string position
> i
>
>
>
>
> U
> g
> invalid string position
>
> U
> ing position
>
>
> &
>
>
>
>
> ring position
> !
> n
>
> oo long
>
>
>
>
>
> o
> position
QtCreator 中还有一段更复杂的代码(在主循环中有相同的 cout rand endl 语句)
> atform\mainwindow.cpp:210
>0
>I , null image received
>indow.cpp:210
>(QImage)
>dImage(QImage)
>, error: image not read from file!
> updatePlayerUI , null image received
>updatePlayerUI(QImage)
>ow.cpp:210
>dImage(QImage)
>ot chosen
>s not chosen
>og, error: image not read from file!
> was not chosen
>age not read from file!
>r: image not read from file!
>neDataPlatform\mainwindow.cpp:210
>error: image not read from file!
这是什么原因?
"image"
的类型是const char*
,你这里是做指针运算
"image" + rand() % 255
这是(可能)未定义的行为,因为您(可能)在为该字符串分配的内存之外访问。做你想做的事
std::cout << "image" << (rand() % 255) << std:endl
或
std::cout << "image" + std::to_string(rand() % 255) << std:endl
"image" + rand() % 255
此表达式与您认为的不同。
你以为是"take the result of the expression rand() % 255
, convert it to a string, and concatenate it with the string "image"
".
其实就是"take the pointer to the literal string "image"
and increment that pointer by rand() % 255
characters."
当 rand() % 255
的结果大于 5(越界内存访问)时,这会导致未定义的行为。
在这种特殊情况下,您的编译器在生成的程序中将字符串文字值彼此相邻存储,因此递增指向字符串文字的指针将遍历该内存并捕获随机字符串。
完成此操作的正确方法是:
std::cout << "image" << (rand() % 255) << std::endl;
在做一个小项目时,我想我可以用像这样的一点代码生成 "random" 文件名,
std::cout << "image"+rand()%255 << std::endl;
我得到的输出对我来说毫无意义。它们似乎是错误消息的随机部分。
比如这段代码:
int main()
{
while(1){
std::cout << "image" + rand() % 255 << std::endl;
}
return 0;
}
产生如下乱码:
> ge
>
> n
>
>
> i
>
>
> ring too long
>
> U
>
>
>
>
>
> &
>
> n
> _
> o
> string position
> e
> lid string position
> i
>
>
>
>
> U
> g
> invalid string position
>
> U
> ing position
>
>
> &
>
>
>
>
> ring position
> !
> n
>
> oo long
>
>
>
>
>
> o
> position
QtCreator 中还有一段更复杂的代码(在主循环中有相同的 cout rand endl 语句)
> atform\mainwindow.cpp:210
>0
>I , null image received
>indow.cpp:210
>(QImage)
>dImage(QImage)
>, error: image not read from file!
> updatePlayerUI , null image received
>updatePlayerUI(QImage)
>ow.cpp:210
>dImage(QImage)
>ot chosen
>s not chosen
>og, error: image not read from file!
> was not chosen
>age not read from file!
>r: image not read from file!
>neDataPlatform\mainwindow.cpp:210
>error: image not read from file!
这是什么原因?
"image"
的类型是const char*
,你这里是做指针运算
"image" + rand() % 255
这是(可能)未定义的行为,因为您(可能)在为该字符串分配的内存之外访问。做你想做的事
std::cout << "image" << (rand() % 255) << std:endl
或
std::cout << "image" + std::to_string(rand() % 255) << std:endl
"image" + rand() % 255
此表达式与您认为的不同。
你以为是"take the result of the expression rand() % 255
, convert it to a string, and concatenate it with the string "image"
".
其实就是"take the pointer to the literal string "image"
and increment that pointer by rand() % 255
characters."
当 rand() % 255
的结果大于 5(越界内存访问)时,这会导致未定义的行为。
在这种特殊情况下,您的编译器在生成的程序中将字符串文字值彼此相邻存储,因此递增指向字符串文字的指针将遍历该内存并捕获随机字符串。
完成此操作的正确方法是:
std::cout << "image" << (rand() % 255) << std::endl;