預(yù)想的是每次循環(huán)生成的隨機(jī)數(shù)不一樣,但實(shí)際使用Random函數(shù)生成的是重復(fù)的。
以下是部分原代碼:
List updateList = new ArrayList();
for(Object o: fieldList){
Map map = new HashMap();
map.put("id", o.get("id"));
map.put("dataId", o.get("dataId"));
map.put("type", "number");
map.put("data", ${__Random(1,10000)});
JSONObject jsonObj = new JSONObject(map);
updateList.add(jsonObj);
}
生成的updateList為:
[{“id”:235214718648462,“dataId”:null,“data”:6708,“type”:“number”}, {“id”:318239582208002,“dataId”:333989510397954,“data”:6708,“type”:“number”}, {“id”:333989483134978,“dataId”:333989510397957,“data”:6708,“type”:“number”}]
分析原因:
在需要循環(huán)創(chuàng)建隨機(jī)數(shù)的時(shí)候,聲明Random對(duì)象時(shí),不能將語句寫在循環(huán)體內(nèi),Randon是基于系統(tǒng)時(shí)間相關(guān)種子來生成隨機(jī)數(shù)的,而在15毫秒以內(nèi)的循環(huán)里面,不斷實(shí)例化對(duì)象最后產(chǎn)生的隨機(jī)數(shù)有可能都是一樣的,因?yàn)橛捎谄溆邢薜慕鉀Q方法,系統(tǒng)時(shí)鐘不會(huì)檢測(cè)少于大約15 毫秒的時(shí)間差異。
初始化兩個(gè)隨機(jī)數(shù)生成器的緊湊循環(huán)中或在短期內(nèi)創(chuàng)建兩個(gè)隨機(jī)數(shù)生成器可能會(huì)產(chǎn)生相同的隨機(jī)數(shù)字序列。在大多數(shù)情況下,這不是開發(fā)人員的意圖,會(huì)導(dǎo)致性能問題,因?yàn)閷?shí)例化和初始化隨機(jī)數(shù)生成器是一個(gè)代價(jià)相對(duì)較大的過程。所以,我們?cè)趯?shí)例化Random類對(duì)象的時(shí)候,盡量寫在循環(huán)外部,用同一個(gè)對(duì)象去生成一組隨機(jī)數(shù),就能規(guī)避以上問題。當(dāng)然,你也可以用線程Sleep等,也就是讓循環(huán)中有時(shí)間間隔,這樣也能達(dá)到效果;文章來源:http://www.zghlxwxcb.cn/news/detail-807006.html
修改后代碼:文章來源地址http://www.zghlxwxcb.cn/news/detail-807006.html
List updateList = new ArrayList();
Random randomData = new Random();
for(Object o: fieldList){
Map map = new HashMap();
map.put("id", o.get("id"));
map.put("dataId", o.get("dataId"));
map.put("type", "number");
map.put("data", randomData.nextInt(1,10000));
JSONObject jsonObj = new JSONObject(map);
updateList.add(jsonObj);
}
到了這里,關(guān)于Jmeter-BeanShell腳本中for循環(huán)里面使用random隨機(jī)數(shù)函數(shù),每次生成的都一樣的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!