У меня есть простое приложение, которое должно генерировать случайную строку из массива. Теперь происходит то, что когда я запускаю приложение, каждый раз я получаю одни и те же результаты. Это происходит на симуляторе и реальном устройстве.
Теперь я нашел разные вещи в Интернете. Одни говорят, что это ошибка, другие говорят, что это по умолчанию. Другие говорят, что вы должны установить случайное семя, но как мне это сделать?
Как я могу это исправить, чтобы каждый раз получать разные строки.
Это мой код:
class SmarttechtransKaartActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_smarttechtrans_kaart)
val Carts = arrayOf("" +
"1. goobzrort",
"2. yweagS",
"3. ikhrescelte toau",
"4. erecksliteh daeltoue",
"5. jzdrfnlieed vrutioeg",
"6. itdnrre-3p",
"7. rp-i4rtedn",
"8. edron",
"9. uenkifser",
"10. ligeovdl srehelikct cihps",
"11. smigakuetnt eiitelltnegni",
"12. dlnwoemin",
"13. bnaardknsepiige",
"14. dR-coQe",
"15. aadt",
"16. nlicohkabc",
"17. enokeciosninem",
"18. iuhitlm nio eraibjtt",
"19. tnaueoozn",
"20. mstartawch",
"21. bRlrV-i",
"22. tirtenne",
"23. ecaram",
"24. ldelpma",
"25. rbotorstufieogz",
"26. miasceuothta sreagrimaa",
"27. emslmi tatmtrohsae",
"28. tpasdoc",
"29. rerirfya",
"30. eradoazld drealpo",
"31. creietttiilek",
"32. GSP",
"33. ntoiibc",
"34. rnttInee of Tighsn",
"35. egevrselnearvv",
"36. citsrhbieeom tnenoatlgcegosro",
"37. ezdmurua reeieng",
"38. tiajtreibbo",
"39. ayesnietetvimags",
"40. udtsomeinre",
"41. koeoebrntuk",
"42. geatmednu aeytlri",
"43. thootelbu",
"44. gnfaree",
"45. cvreleati nudbwola",
"46. semlmi olksatek",
"47. nosrse",
"48. terabee sesonr lpi",
"49. oormlhag",
"50. ibg adat",
)
button.setOnClickListener() {
val random = Carts.random()
tvvoorkant.setText(random)
}
}
}
ОБНОВИТЬ! ИСПРАВИТЬ:
button.setOnClickListener {
//OLD: Gets same result on relaunch app...
val random = Carts.random()
textview.text = randomValue
//NEW: Gets different result on relaunch app...
val randomString = Random(System.currentTimeMillis())
val randomValue = Carts[randomString.nextInt(Carts.size)]
textview.text = randomValue
Отвечает ли это на ваш вопрос? Kotlin random() всегда генерирует одни и те же «случайные» числа
Спасибо за ваши ответы и за то, что нашли время посмотреть на мою проблему! Я исправил проблему, используя System.currentTimeMillis().
Одна важная вещь, которую вам нужно знать о случайных значениях в целом, это то, что они не случайны, они псевдослучайны.
Компьютер не может генерировать случайные значения. Что он делает, так это генерирует огромную последовательность чисел, которая кажется случайной, но в конечном итоге будет повторяться. Вот где семя имеет значение
Обычно вы видите, как люди создают экземпляры Random
и используют значения, которые он дает, как если бы они были случайными, но поскольку используемое семя всегда одно и то же, последовательность псевдослучайных значений всегда будет одинаковой.
Для «действительно» случайных значений вам нужно каждый раз указывать разные начальные значения. Вы можете смело использовать System.currentTimeMillis()
для этого
**Обратите внимание, что сейчас у меня нет IDE, поэтому синтаксис может быть неточным. Вы можете положиться на функции автозаполнения для правильного синтаксиса
ОБНОВИТЬ
Хорошо, я проверил документы. Взгляните на Random docs для создания нового Random
экземпляра с пользовательским начальным числом, случайную функцию расширения для ее использования в ваших массивах и getTimeMillis для получения уникального начального числа для ваших случайных экземпляров.
Большое спасибо за отличный ответ. Вы устранили проблему. Я обновил свой вопрос с исправлением на основе вашего ответа.
Какую версию Kotlin, Android вы используете? В некоторых версиях Kotlin+Android есть известная ошибка youtrack.jetbrains.com/issue/KT-52618 issuetracker.google.com/issues/234631055