teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

回答誤りについて訂正。

2021/10/02 17:53

投稿

cx20
cx20

スコア4700

answer CHANGED
@@ -1,11 +1,39 @@
1
- バッチファイルの先頭に
1
+ ~~バッチファイルの先頭に~~
2
+ ~~setlocal enabledelayedexpansion~~
3
+ ~~を入れて試してみて下さい。~~
2
4
 
3
- ```
5
+ ~~<参考>~~
4
- setlocal enabledelayedexpansion
6
+ ~~■ 指定長・個数のランダム数字列生成バッチ(Windows編)~~
5
- ```
7
+ ~~[https://qiita.com/real_yaruo/items/8d7c5abe37a73e2fc408](https://qiita.com/real_yaruo/items/8d7c5abe37a73e2fc408)~~
6
8
 
7
- を入れて試してみて下さい。
9
+ 回答に誤りがあった為、訂正しておきます。(コメントで情報提供ただいた方ありがとうございます
8
10
 
11
+ `enabledelayedexpansion`(遅延環境変数)は `%RANDOM%` とは本質的に関係ありません。
12
+ (Qiita 記事に書いてあったのは、`for`文の中で `%RANDOM%` を使う場合に必要ということでした。)
13
+
14
+ > 実行してみると、ターミナルを起動してから一回目は8しか出ません
15
+
16
+ 同じ値が出ている原因ですが、`%RANDOM%` の結果として、似通った値が返ってきていることが原因です。
17
+ 以下は `%RANDOM%` の出力例になります。
18
+
9
- <参考>
19
+ 19:05:06.97 / 21763
20
+ 19:05:07.22 / 21767
21
+ 19:05:37.67 / 21865
22
+
23
+ この場合ですと、いずれの場合も%random%*11/32767の計算結果として7が出ることになります。
24
+
25
+ 今回の用途(実行する度に壁紙を変える)であれば、余りを求めるのが良いと思われます。
26
+ 変更前)set /a ran1=%random%*11/32767
10
- ■ 指定長・個数のランダム数字列生成バッチ(Windows編
27
+ 変更後set /a ran1=%random%%%11
28
+
29
+ > ターミナルを閉じないでもう一度実行するとちゃんと別の数字がでます。
30
+
31
+ (ターミナルとして PowerShell とコマンドプロンプトが選べるかと思いますが、ここではコマンドプロンプトを利用している想定で書かせて頂きます。)
32
+
33
+ 乱数の元となるシードを cmd.exe の起動時に決定している為です。
34
+ 同じプロセス内(cmd.exe内)では、シードが決定した後は、疑似乱数が正しく機能する為、実行する度にランダムな値が表示されます。
35
+
36
+ `%RANDOM%` がそれ程ランダムでない値を返す理由については下記ブログに記事がありましたので、興味がありましたら参照下さい。
37
+
38
+ ■ As random as I wanna be: Why cmd.exe's %RANDOM% isn't so random
11
- [https://qiita.com/real_yaruo/items/8d7c5abe37a73e2fc408](https://qiita.com/real_yaruo/items/8d7c5abe37a73e2fc408)
39
+ [https://devblogs.microsoft.com/oldnewthing/20100617-00/?p=13673](https://devblogs.microsoft.com/oldnewthing/20100617-00/?p=13673)