Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Successive calls to Sentence() always return the (almost) same sentence #9

Open
n-peugnet opened this issue Jan 10, 2025 · 1 comment · May be fixed by #10
Open

Successive calls to Sentence() always return the (almost) same sentence #9

n-peugnet opened this issue Jan 10, 2025 · 1 comment · May be fixed by #10

Comments

@n-peugnet
Copy link

n-peugnet commented Jan 10, 2025

I expected successive calls Sentence() to return (very) different sentences (with always the same sequence for a given seed), but it currently always returns (almost) the same one.
I am forced to generate an array of sentences beforehand using SentenceList(), but this is suboptimal, for multiple reasons:

  1. It uses a lot of memory
  2. I use the seed for other random operations, so if I generate an array of a different size, then the rest of my pseudo-random numbers will not be the same. Instead, if I was able to call Sentence() in my loop, along the rest of my random number generation, and get a new sentence each time, I would not have this issue.

I know that changing this might be a breaking change for some people, so I am not sure what would be the best way to implement it. I tested this patch:

--- /home/nicolas/go/pkg/mod/github.com/go-loremipsum/[email protected]/loremipsum.go	2025-01-10 14:22:39.292924964 +0100
+++ /tmp/loremipsum.go	2025-01-10 14:25:02.461104401 +0100
@@ -52,6 +52,7 @@
 
 // Sentence returns full sentence of lorem ipsum
 func (li *LoremIpsum) Sentence() string {
+	defer li.shuffle()
 	for {
 		l := int(li.gauss(24.46, 5.08))
 		if l > 0 {
@@ -66,7 +67,6 @@
 	sentences := make([]string, count)
 	for idx := range sentences {
 		sentences[idx] = li.Sentence()
-		li.shuffle()
 	}
 	return sentences
 }

And it behaves as I would like it to. But it would probably be better to add a new function, for example NewSentence(), to keep the behaviour of the previous one intact, and maybe deprecating it.

Also I didn't test the other methods for words and paragraphs, but they probably have the same issue.
I tested Word() and Paragraph() and they didn't display the same issue, so maybe applying the patch and releasing a minor version would be enough?

What do you think about this?


EDIT: Sorry, I tested this a bit more, and it turns out the sentences are slightly different, but not in the sense I was expecting. They are all a variation of the same sentence. I expected them to be very different.

For example, the following code...

package main

import (
	"fmt"

	"github.com/go-loremipsum/loremipsum"
)

func main() {
	li := loremipsum.NewWithSeed(1)
	for i := 0; i < 10; i++ {
		fmt.Println(li.Sentence())
	}
}

...prints this:

Lorem ipsum dolor sit amet consectetur adipiscing elit, vel aliquam magna semper ultricies elementum ligula molestie nostra curae id est convallis suscipit tempor.
Lorem ipsum dolor sit amet consectetur adipiscing elit, vel aliquam magna semper, ultricies elementum ligula molestie nostra curae id est convallis suscipit tempor. malesuada maximus vitae pulvinar libero vestibulum dictumst accumsan pharetra habitant eget sed.
Lorem ipsum dolor sit amet consectetur adipiscing elit, vel aliquam magna semper, ultricies elementum ligula molestie nostra curae id est.
Lorem ipsum dolor sit amet consectetur adipiscing elit, vel aliquam magna semper, ultricies elementum ligula molestie nostra curae id.
Lorem ipsum dolor sit amet consectetur adipiscing elit, vel aliquam, magna semper, ultricies elementum ligula molestie nostra curae id. est. convallis suscipit tempor. malesuada maximus vitae pulvinar libero.
Lorem ipsum dolor sit amet consectetur adipiscing elit, vel aliquam, magna semper, ultricies elementum ligula molestie nostra curae id. est. convallis suscipit tempor. malesuada.
Lorem ipsum dolor sit amet consectetur adipiscing elit, vel aliquam, magna semper, ultricies elementum ligula molestie nostra curae id. est. convallis suscipit tempor. malesuada. maximus vitae pulvinar libero. vestibulum dictumst accumsan pharetra habitant eget.
Lorem ipsum dolor sit amet consectetur adipiscing elit, vel aliquam,, magna semper, ultricies elementum ligula molestie nostra curae id. est. convallis suscipit tempor. malesuada. maximus vitae pulvinar.
Lorem ipsum dolor sit amet consectetur adipiscing elit, vel aliquam,, magna semper, ultricies elementum ligula molestie nostra curae id. est. convallis suscipit tempor. malesuada. maximus.
Lorem ipsum dolor sit amet consectetur adipiscing elit, vel aliquam,, magna semper, ultricies elementum ligula molestie nostra curae.
Results for Word() instead of Sentence()
cras
primis
ridiculus
cursus
dapibus
natoque
congue
dignissim
tempus
aliquet
Results for Paragraph() instead of Sentence()
Lorem ipsum dolor sit amet consectetur adipiscing elit vel aliquam, magna semper ultricies elementum ligula molestie nostra curae id est convallis suscipit tempor malesuada maximus vitae pulvinar libero vestibulum. Est hendrerit ornare purus vulputate consectetur feugiat libero et curabitur finibus lacinia class euismod ligula malesuada adipiscing fringilla primis nec eros cras laoreet. Malesuada interdum maecenas ac eget augue penatibus rhoncus odio vivamus montes libero amet elementum justo magnis risus massa nec. Aliquam at purus vulputate orci facilisi consequat morbi libero euismod egestas phasellus integer suspendisse ridiculus mattis torquent eleifend lorem faucibus ornare pulvinar maximus. Pretium commodo adipiscing erat diam fringilla himenaeos faucibus accumsan semper posuere vehicula enim in ultricies ullamcorper maximus ultrices quam libero duis eros sociosqu varius facilisi integer aliquet mi tempus tellus vestibulum donec.
Primis suspendisse suscipit elementum nibh tristique donec gravida leo mus posuere habitant vulputate mauris vestibulum quis enim porttitor luctus at metus viverra. Magna non magnis ipsum ut primis finibus ex justo lectus luctus elementum volutpat sit euismod posuere quisque ligula maximus viverra aliquam potenti molestie vehicula mus. Nullam suscipit ad habitant sed ultricies odio efficitur ultrices primis dignissim, sagittis pulvinar inceptos facilisi ipsum vitae finibus congue lectus hac fermentum fringilla rhoncus magna mi curabitur lorem ligula nisl. Rhoncus torquent parturient turpis curae urna erat justo lobortis proin conubia ac duis velit sodales diam rutrum gravida porta leo magnis himenaeos vestibulum nisl. Interdum natoque adipiscing luctus aliquet rutrum pellentesque sollicitudin, congue hendrerit egestas nostra proin ultrices tempus suspendisse justo nunc pharetra felis in odio. Ut cras mauris rutrum tellus semper ac montes potenti maximus nullam scelerisque mollis tortor habitant volutpat.
Viverra velit nascetur aptent neque elit mi suscipit quam enim turpis faucibus interdum sem sit nisl lorem arcu donec erat taciti ligula vitae dignissim fringilla. Habitasse ornare lorem blandit nulla sed finibus sociosqu sollicitudin inceptos aliquam curae dignissim platea maecenas nullam lacus tempor lacinia convallis facilisis felis sapien orci auctor. Vestibulum donec eleifend mattis id in per pharetra lorem facilisi nec ullamcorper convallis litora erat sem ac quis placerat malesuada egestas ornare. Velit pretium orci augue potenti pellentesque id integer elit ridiculus feugiat faucibus primis cursus nunc maecenas sociosqu senectus nulla dolor rutrum quisque eget.
Volutpat netus ligula conubia phasellus duis maecenas auctor condimentum tellus, mi sem feugiat risus magna viverra fames scelerisque lacinia curae curabitur sodales fermentum ante lacus accumsan neque. Lorem tincidunt curae leo tellus auctor magna, nostra suspendisse phasellus penatibus ultrices id viverra sit aliquam felis luctus. Dictum lacus magnis euismod mauris tempor leo etiam a aliquet quis ut nullam consectetur habitant elementum. Aptent et rhoncus ipsum amet inceptos commodo risus consequat odio adipiscing facilisi porttitor placerat pulvinar urna enim class netus lectus fames erat integer. Dui adipiscing mollis luctus molestie pulvinar vivamus malesuada blandit suscipit varius netus sollicitudin aenean fames phasellus nulla praesent enim nibh sit consectetur pellentesque elementum at metus lectus laoreet.
Ultrices lacinia iaculis quis curabitur purus semper rutrum maecenas sed massa laoreet class cursus maximus ullamcorper vel ridiculus phasellus a mauris sit dis orci velit. Curae per etiam sociosqu ad hac praesent mollis habitasse dapibus elementum sagittis tempor nisl augue parturient ac consequat blandit cursus convallis libero ligula risus. Leo mattis lacus cubilia taciti interdum dignissim conubia nostra pretium parturient curae molestie blandit lobortis iaculis donec maecenas fringilla mollis sapien congue fusce nibh adipiscing. Conubia quam varius eget aliquet rutrum praesent ridiculus eu mollis pharetra a ut lacus risus nostra semper dolor natoque pulvinar tellus magnis vulputate himenaeos egestas et pretium penatibus sed massa est interdum sagittis parturient. Senectus accumsan amet nulla curabitur phasellus netus porta fusce malesuada tincidunt dis massa, in himenaeos aliquet convallis a leo tellus morbi at sollicitudin gravida sapien molestie fermentum luctus libero erat cubilia mi hendrerit ornare pulvinar vulputate.
Hac sem erat condimentum justo quam quisque dis nunc senectus diam a primis odio gravida tellus porta maximus proin libero velit inceptos vehicula pretium efficitur. Pretium massa semper posuere ac iaculis tincidunt accumsan cursus odio mauris dictumst habitant est amet blandit facilisis sodales curae dis vivamus conubia ante. Vehicula ullamcorper lacinia facilisis congue quis imperdiet taciti semper tristique, morbi lacus consectetur lobortis cras integer volutpat nullam consequat est habitasse nec sociosqu eros cursus natoque nunc suspendisse ligula. Finibus fringilla elit ipsum imperdiet purus nisl nostra eros varius placerat dapibus tristique feugiat erat aptent bibendum suspendisse posuere blandit justo risus et convallis taciti venenatis primis proin phasellus. Fusce mi interdum massa maximus mollis ac euismod montes odio metus cubilia nec convallis scelerisque nullam facilisis efficitur ultrices curabitur accumsan luctus congue lacus cursus vivamus feugiat inceptos molestie. Eleifend feugiat sagittis in sodales pulvinar velit vestibulum iaculis vel vivamus finibus ut quis hendrerit nisl varius venenatis massa mi fames elementum lacinia.
Ornare semper senectus eu sit finibus phasellus aliquam iaculis ligula donec aliquet euismod consectetur potenti dictum fames per inceptos commodo maecenas laoreet purus congue dis varius cubilia rhoncus conubia aptent ac dictumst. Platea luctus mauris gravida augue vitae est suspendisse lacinia vivamus scelerisque placerat maecenas rhoncus posuere commodo amet hendrerit mattis purus curabitur congue. Dictum massa elit morbi dolor nulla lacus facilisi rhoncus dictumst molestie posuere neque finibus senectus nec nascetur torquent et cursus diam odio vel fringilla integer tempus. Vehicula nec duis porttitor ligula cras eget nisl maecenas ex massa ridiculus curae etiam vestibulum nascetur accumsan posuere molestie. Enim nunc rhoncus turpis gravida nascetur tempus vehicula mollis fusce, suspendisse interdum magnis porttitor torquent velit adipiscing habitasse auctor sociosqu aliquet consectetur finibus est lobortis tincidunt aliquam suscipit. Ultrices vivamus lacinia ornare feugiat maximus parturient potenti enim posuere odio ullamcorper platea morbi rhoncus fringilla nascetur hac litora faucibus vehicula.
Nunc imperdiet pretium tempus laoreet tristique diam maximus vel amet est fermentum ad non curabitur nulla sit litora tincidunt hac aptent urna convallis tellus pharetra mi egestas lorem. Dictum dui bibendum gravida vulputate taciti dolor id quisque suspendisse lacinia, est egestas ultricies tincidunt leo hendrerit odio ligula himenaeos risus habitasse et imperdiet nibh aenean maecenas iaculis convallis aliquam. Habitasse natoque efficitur laoreet torquent dui fames montes molestie adipiscing potenti augue ultricies parturient eros elit quam velit urna libero pharetra. Conubia sapien parturient id auctor vivamus luctus massa platea erat semper arcu nibh ac porttitor tristique aenean quam sollicitudin in mauris litora scelerisque tellus congue metus dapibus. Lectus scelerisque malesuada mattis vulputate pretium semper conubia viverra facilisis, congue lacus per a inceptos velit nam euismod id sollicitudin metus turpis ligula etiam purus aenean eros. At cras pharetra tempus tempor vulputate sem, nostra bibendum ipsum integer cursus eu vel ullamcorper faucibus cubilia conubia nam malesuada. Tempus et laoreet a eleifend risus congue at bibendum imperdiet odio turpis fermentum nisl himenaeos metus ac conubia quis praesent suspendisse suscipit feugiat enim magnis finibus id cursus mi curae.
At turpis cubilia taciti ex magna lobortis himenaeos class pharetra volutpat mauris ut ornare facilisi risus hac sapien. Inceptos rutrum et porta nisl posuere sollicitudin tellus vel lorem vivamus mi sit pharetra ex condimentum eleifend duis volutpat lacus nec. Dignissim non commodo congue erat efficitur lacus ac ullamcorper tellus habitasse vehicula potenti varius interdum tortor ante volutpat nullam aenean pellentesque conubia nibh. Ultricies sollicitudin vehicula placerat ut sagittis phasellus habitant finibus leo elit est conubia condimentum sit congue suspendisse per integer orci penatibus himenaeos. Congue cubilia dictumst ultrices iaculis per at conubia ligula consectetur viverra massa vitae maximus penatibus habitasse mi sit gravida erat torquent aliquet. Sollicitudin venenatis quis varius litora scelerisque nisl elit vitae mus praesent cubilia montes primis natoque finibus faucibus ac sapien interdum auctor molestie at consequat.
Aenean tempor ante parturient nulla quisque suscipit orci curabitur fames lorem pretium posuere erat molestie nostra est dictumst adipiscing conubia nisl ornare vestibulum ac. Lorem ornare faucibus euismod phasellus platea dapibus ex velit curae facilisis et ridiculus sit felis nostra at senectus rhoncus. Tempor rhoncus non mauris magnis quis quisque nec ligula amet ex consequat morbi molestie litora curabitur dapibus odio tortor sit donec nunc euismod cras mattis. Fames auctor enim tempus nunc nam laoreet felis sodales maximus vehicula faucibus aliquet ac neque mus nascetur torquent cras maecenas semper volutpat est aenean suspendisse vestibulum phasellus magnis in magna tempor nostra.

Whereas with my proposed patch, I get the following, which is what I expected:

Lorem ipsum dolor sit amet consectetur adipiscing elit, vel aliquam magna semper ultricies elementum ligula molestie nostra curae id est convallis suscipit tempor.
Eros erat finibus vitae viverra congue pharetra venenatis ultricies interdum fringilla habitasse aliquam conubia vulputate leo praesent massa proin lacinia penatibus feugiat vivamus rhoncus vestibulum magna.
Volutpat molestie ultricies efficitur risus rutrum cursus pulvinar mus fringilla auctor neque integer amet montes quisque nascetur taciti scelerisque dis.
Lobortis rhoncus eget lectus ullamcorper nunc felis ligula blandit elit phasellus facilisi nisl eu morbi faucibus lorem duis pretium aptent turpis massa justo efficitur donec.
Pharetra lectus pellentesque mollis montes tellus per potenti viverra suspendisse tristique, accumsan hac magnis enim volutpat vestibulum elementum donec integer dolor imperdiet finibus porta aliquam dui senectus netus non quisque ridiculus.
Ridiculus adipiscing quam sapien posuere nascetur penatibus sociosqu neque fusce porta proin ultrices lectus purus magnis eleifend morbi risus sollicitudin hac ac elementum odio mollis accumsan.
Sit nulla ipsum sem platea proin etiam sapien netus iaculis aenean vivamus ex est maecenas lacinia in fermentum ullamcorper rhoncus diam hac natoque erat.
Curabitur consequat velit tristique sapien lacinia magna ad varius condimentum sollicitudin ipsum vitae phasellus maecenas gravida vivamus proin leo nibh senectus.
Praesent nunc egestas suspendisse enim in vulputate urna maximus tempor vestibulum ut dictumst per mus mauris a netus eros ultrices facilisis nullam eu etiam aptent faucibus.
Tristique nostra fames consectetur sodales imperdiet volutpat condimentum semper elit pellentesque dolor class penatibus hac erat sed ornare.

(Results for Word() and Paragraph() are identical.)

@n-peugnet
Copy link
Author

For more details about my use case, this would allow me to do this:

diff --git a/main.go b/main.go
index 31b7188..76a7048 100644
--- a/main.go
+++ b/main.go
@@ -116,13 +116,12 @@ func generateMessages(seed int64, senders int, limit int) []*Message {
        source := rand.NewSource(seed)
        random := rand.New(source)
        lorem := loremipsum.NewWithSource(source)
-       bodies := lorem.SentenceList(limit)
        for i := 0; i < limit; i++ {
                delay += random.Int63n(maxdelay)
                msg := &Message{
                        Delay: time.Millisecond * time.Duration(delay),
                        From:  random.Intn(senders),
-                       Body:  bodies[i],
+                       Body:  lorem.Sentence(),
                }
                messages = append(messages, msg)
        }

And this would result in always the same sequence of random numbers and messages, even when changing the limit parameter.

@n-peugnet n-peugnet changed the title Successive calls to Sentence() always return the same sentence Successive calls to Sentence() always return the (almost) same sentence Jan 10, 2025
n-peugnet added a commit to n-peugnet/loremipsum that referenced this issue Jan 13, 2025
By calling li.shuffle() at the end of Sentence() instead of in
SentenceList(), successive calls to Sentence() actually return very
different sentences instead of small variations of the same sentence.

Closes: go-loremipsum#9
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

1 participant